1042: [HAOI2008]硬币购物 - BZOJ
Description
硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买si的价值的东西。请问每次有多少种付款方法。
Input
第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s
Output
每次的方法数
Sample Input
1 2 5 10 2
3 2 3 1 10
1000 2 2 2 900
Sample Output
4
27
数据规模
di,s<=100000
tot<=1000
每一次都做一次多重背包跟定是不行的,这个先预处理一下,然后可以用容斥原理O(1)回答
我们可以这样用容斥,先算出没有限制钱币数量的方案数,记为f[i],表示没有限制,总价值为i的方案数,然后减去至少一种钱币超过限制的方案数,加上至少两种钱币超过限制的方案数,减去至少三种钱币超过限制的方案数,最后加上四种钱币都超过限制的方案数,第i种钱币超过限制就是第i种钱币至少用了di+1个(例:第1种钱币超过限制的方案数就是f[s-c[1]*(d1+1)])
犯了一个傻逼错误
求f[i]的时候我是这么求的
for i:= to maxs do
for j:= to do
inc(f[i],fn(i-c[j]));
然后理所当然的爆了int64
为了不重复计算方案,所以应该以j为阶段(话说动态规划的阶段是什么早就忘了),就像这样
for j:= to do
for i:= to maxs do
inc(f[i],fn(i-c[j]));
吐槽:
R:容斥原理是什么?我们学过吗?
X:学过啊
R:额,这算学过吗,我只记得老师叫我们用容斥写在100以内是2,3,5的倍数的数有多少,然后要我们查公式,这TM有什么意思,这个题有必要做吗,换个例题不行啊
当时我就想啊,容斥这么垃圾(不要打我......),我就直接跳过了,没想到容斥原来用处挺大的啊(当时讲的那个例题毫无吸引力好吗)
const
maxs=;
var
f:array[..maxs]of int64;
c:array[..]of longint;
n:longint;
ans:int64; function fn(x:longint):int64;
begin
if x>= then exit(f[x]);
exit();
end; procedure main;
var
i,j,d1,d2,d3,d4,s:longint;
begin
for i:= to do
read(c[i]);
f[]:=;
for j:= to do
for i:= to maxs do
inc(f[i],fn(i-c[j]));
read(n);
for i:= to n do
begin
read(d1,d2,d3,d4,s);
ans:=fn(s);
dec(ans,fn(s-c[]*(d1+)));
dec(ans,fn(s-c[]*(d2+)));
dec(ans,fn(s-c[]*(d3+)));
dec(ans,fn(s-c[]*(d4+)));
inc(ans,fn(s-c[]*(d1+)-c[]*(d2+)));
inc(ans,fn(s-c[]*(d1+)-c[]*(d3+)));
inc(ans,fn(s-c[]*(d1+)-c[]*(d4+)));
inc(ans,fn(s-c[]*(d2+)-c[]*(d3+)));
inc(ans,fn(s-c[]*(d2+)-c[]*(d4+)));
inc(ans,fn(s-c[]*(d3+)-c[]*(d4+)));
dec(ans,fn(s-c[]*(d2+)-c[]*(d3+)-c[]*(d4+)));
dec(ans,fn(s-c[]*(d1+)-c[]*(d3+)-c[]*(d4+)));
dec(ans,fn(s-c[]*(d1+)-c[]*(d2+)-c[]*(d4+)));
dec(ans,fn(s-c[]*(d1+)-c[]*(d2+)-c[]*(d3+)));
inc(ans,fn(s-c[]*(d1+)-c[]*(d2+)-c[]*(d3+)-c[]*(d4+)));
writeln(ans);
end;
end; begin
main;
end.
1042: [HAOI2008]硬币购物 - BZOJ的更多相关文章
- Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp
1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1747 Solved: 1015[Submit][Stat ...
- bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理
题目链接 1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1706 Solved: 985[Submit][ ...
- BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )
先按完全背包做一次dp, dp(x)表示x元的东西有多少种方案, 然后再容斥一下. ---------------------------------------------------------- ...
- BZOJ 1042: [HAOI2008]硬币购物 [容斥原理]
1042: [HAOI2008]硬币购物 题意:4种硬币.面值分别为c1,c2,c3,c4.1000次询问每种硬币di个,凑出\(s\le 10^5\)的方案数 完全背包方案数? 询问太多了 看了题解 ...
- 【BZOJ】1042: [HAOI2008]硬币购物
1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3307 Solved: 2075[Submit][Stat ...
- BZOJ 1042: [HAOI2008]硬币购物 容斥+背包
1042: [HAOI2008]硬币购物 Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请 ...
- BZOJ 1042 [HAOI2008]硬币购物(完全背包+容斥)
题意: 4种硬币买价值为V的商品,每种硬币有numi个,问有多少种买法 1000次询问,numi<1e5 思路: 完全背包计算出没有numi限制下的买法, 然后答案为dp[V]-(s1+s2+s ...
- 【BZOJ】1042: [HAOI2008]硬币购物(dp+容斥原理)
http://www.lydsy.com/JudgeOnline/problem.php?id=1042 一开始写了个O(nv)的背包,果断tle... 看了题解,,好神..用了组合数学中的多重集合方 ...
- BZOJ 1042: [HAOI2008]硬币购物 (详解)(背包&容斥原理)
题面:https://www.cnblogs.com/fu3638/p/6759919.html 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚 ...
随机推荐
- 约瑟夫环(N个人围桌,C语言,数据结构)
约瑟夫环问题(C语言.数据结构版) 一.问题描述 N个人围城一桌(首位相连),约定从1报数,报到数为k的人出局,然后下一位又从1开始报,以此类推.最后留下的人获胜.(有很多类似问题,如猴子选代王等等, ...
- UML——动态建模
- 关于对XE7中introduced in an ancestor and cannot be deleted的解决方案
在Delphi XE7中设计Multi-Device Application 类型窗体中,发现删除一个组件时,提示introduced in an ancestor and cannot be del ...
- Cocos2d-x中自定义粒子系统
除了使用Cocos2d-x的11种内置粒子系统外,我们还可以通过创建ParticleSystemQuad对象,并设置属性实现自定义粒子系统,通过这种方式完全可以实现我们说需要的各种效果的粒子系统.使用 ...
- (转)卸载和安装LINUX上的JDK
卸载默认的: 用root用户登陆到系统,打开一个终端输入 # rpm -qa|grep gcj 显示内容其中包含下面两行信息 # java-1.4.2-gcj-compat-1.4.2.0-27jpp ...
- c#索引器的简单用法
abstract class Bird { protected string name; public abstract string Name { get; set; } public abstra ...
- C/C++笔试题目
1. C语言中无符号数与有符号数 unsigned ; ; printf( printf( ? 有符号数和无符号数在进行比较运算时(==,>=,<=,>,<),有符号数隐式的转 ...
- Headfirst设计模式的C++实现——复合模式
observer.h #ifndef _OBSERVER_H_ #define _OBSERVER_H_ #include <string> class Observer { public ...
- C#定时器
在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Timers.Timer类里 S ...
- DIV当textarea使用,在聚焦的时候将光标移动到内容的末尾
#### DIV当textarea使用,在聚焦的时候将光标移动到内容的末尾 #### <style type="text/css"> .test_box { width ...