题目描述

硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买si的价值的东西。请问每次有多少种付款方法。

输入输出格式

输入格式:

第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s

输出格式:

每次的方法数

输入输出样例

输入样例#1:

1 2 5 10 2
3 2 3 1 10
1000 2 2 2 900
输出样例#1:

4
27

说明

di,s<=100000

tot<=1000

题解:

一开始认为要求出一个4元方程的解的个数,用容斥求出所有GCD(a,b,c,d)|si的解

但时间复杂度太高,且条件限制不好做。

后面看到一种解法:

用dp求f[i]为钱数为i时的方案总数

显然f[i]=signma(f[i-c[j]])

复杂度为O(4*s)

再用容斥原理求出所有方案,减去1超出限制,再减去2超限,还有3和4。再加上1,2超限.....

i超出限制的方案为f[si-(d[j]+1)*c[j]]

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long c[],d[],tot;
long long f[],ans;
int main()
{long long i,j,s;
cin>>c[]>>c[]>>c[]>>c[]>>tot;
f[]=;
for (i=;i<=;i++)
for (j=c[i];j<=;j++)
{
f[j]+=f[j-c[i]];
}
for (i=;i<=tot;i++)
{
for (j=;j<=;j++)
scanf("%I64d",&d[j]);
scanf("%I64d",&s);
ans=f[s];
if ((d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]];
if ((d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]];
if ((d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]];
if ((d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]]; if ((d[]+)*c[]+(d[]+)*c[]<=s)
ans+=f[s-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]<=s)
ans+=f[s-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]<=s)
ans+=f[s-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]<=s)
ans+=f[s-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]<=s)
ans+=f[s-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]<=s)
ans+=f[s-(d[]+)*c[]-(d[]+)*c[]]; if ((d[]+)*c[]+(d[]+)*c[]+(d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]+(d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]+(d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]-(d[]+)*c[]-(d[]+)*c[]];
if ((d[]+)*c[]+(d[]+)*c[]+(d[]+)*c[]<=s)
ans-=f[s-(d[]+)*c[]-(d[]+)*c[]-(d[]+)*c[]]; if ((d[]+)*c[]+(d[]+)*c[]+(d[]+)*c[]+(d[]+)*d[]<=s)
ans+=f[s-(d[]+)*c[]-(d[]+)*c[]-(d[]+)*c[]-(d[]+)*d[]];
cout<<ans<<endl;
}
}

[HAOI2008]硬币购物的更多相关文章

  1. Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1747  Solved: 1015[Submit][Stat ...

  2. bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理

    题目链接 1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1706  Solved: 985[Submit][ ...

  3. BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )

    先按完全背包做一次dp, dp(x)表示x元的东西有多少种方案, 然后再容斥一下. ---------------------------------------------------------- ...

  4. BZOJ 1042: [HAOI2008]硬币购物 [容斥原理]

    1042: [HAOI2008]硬币购物 题意:4种硬币.面值分别为c1,c2,c3,c4.1000次询问每种硬币di个,凑出\(s\le 10^5\)的方案数 完全背包方案数? 询问太多了 看了题解 ...

  5. BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包

    BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包 题意: 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s i的价值 ...

  6. P1450 [HAOI2008]硬币购物(完全背包+容斥)

    P1450 [HAOI2008]硬币购物 暴力做法:每次询问跑一遍多重背包. 考虑正解 其实每次跑多重背包都有一部分是被重复算的,浪费了大量时间 考虑先做一遍完全背包 算出$f[i]$表示买价值$i$ ...

  7. 【BZOJ】1042: [HAOI2008]硬币购物

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3307  Solved: 2075[Submit][Stat ...

  8. BZOJ1042 [HAOI2008]硬币购物 【完全背包 + 容斥】

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2924  Solved: 1802 [Submit][St ...

  9. 【BZOJ1042】[HAOI2008]硬币购物 容斥

    [BZOJ10492][HAOI2008]硬币购物 Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值 ...

  10. BZOJ 1042: [HAOI2008]硬币购物 容斥+背包

    1042: [HAOI2008]硬币购物 Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请 ...

随机推荐

  1. 关于C语言的第0次作业

    1.你认为大学的学习生活.同学关系.师生关系应该是怎样的?请一个个展开描述. 我认为的大学学习生活是充实的,丰富多彩的,与高中快节奏.繁忙的生活有所不同.在上了大学我们都成熟了很多,懂得了包容与忍让, ...

  2. 20162311张之睿 Linux基础与Java开发环境实验报告

    实验一 Java开发环境的熟悉 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没有Linux基础的同学建议先学习& ...

  3. 初谈Git(本机克隆项目远程仓库)

    1. 码云注册与新建项目 注册并新建项目 2. Git安装并配置 安装 配置 3. clone项目 附:一些Git命令 git clone 拷贝并跟踪远程的master分支 git add 跟踪新文件 ...

  4. 201621123031 《Java程序设计》第7周学习总结

    作业07-Java GUI编程 1.本周学习总结 1.1 思维导图:Java图形界面总结 1.2 可选:使用常规方法总结其他上课内容. 事件监听器: Java事件监听器是由事件类和监听接口组成,自定义 ...

  5. python 二叉堆

    BinaryHeap() 创建一个新的,空的二叉堆. insert(k) 向堆添加一个新项. findMin() 返回具有最小键值的项,并将项留在堆中. delMin() 返回具有最小键值的项,从堆中 ...

  6. Beta集合

    Beta冲刺day1 Beta冲刺day2 Beta冲刺day3 Beta冲刺day4 Beta冲刺day5 Beta冲刺day6 Beta冲刺day7 测试总结 总结合集 Beta预备

  7. Codeforces 193 D. Two Segments

    http://codeforces.com/contest/193/problem/D 题意: 给一个1~n的排列,在这个排列中选出两段区间,求使选出的元素排序后构成公差为1的等差数列的方案数. 换个 ...

  8. [知识梳理]课本1&2.1-2.5

    面向对象的语言 出发点:更直接地描述客观世界中存在的事物(对象)以及它们之间的关系. 特点: 是高级语言. 将客观事物看作具有属性和行为的对象. 通过抽象找出同一类对象的共同属性和行为,形成类. 通过 ...

  9. HTTP头HOST

    http request header 中的host行的作用 在早期的Http 1.0版中,Http 的request请求头中是不带host行的,在Http 1.0的加强版和Http 1.1中加入了h ...

  10. Docker学习笔记 - Docker部署nginx网站

    一.制作 nginx 镜像 1.下载配置文件 mkdir /opt/nginx_docker && cd /opt/nginx_docker mkdir nginx && ...