[BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】
题目链接:BZOJ - 1042
题目分析
首先 Orz Hzwer ,代码题解都是看的他的 blog。
这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案。
为了避免重复的方案被转移,所以我们以硬币种类为第一层循环,这样阶段性的增加硬币。
一定要注意这个第一层循环要是硬币种类,并且初始 f[0] = 1。
f[0] = 1;
for (int i = 1; i <= 4; ++i) {
for (int j = B[i]; j <= MaxS; ++j) {
f[j] += f[j - B[i]];
}
}
之后对于每个询问 (A1, A2, A3, A4, S) ,根据容斥原理,我们要求的答案 Ans 就是 f[S] - (硬币1超限制的方案数) - (硬币2超限制的方案数) - (硬币3超限制的方案数) - (硬币4超限制的方案数) + (硬币1,2超限制的方案数) + (硬币1,3超限制的方案数) + (硬币1,4超限制的方案数) + .... - (硬币1,2,3超限制的方案数) - ... + (硬币1,2,3,4超限制的方案数) 。
怎样求硬币1超限制的方案数呢?我们只要先固定取 (A1+1) 个硬币1,剩余的钱数随便取就可以了,就是 f[S - (A1+1) * V[1]] 。
其余的情况都类似。
容斥的部分使用搜索实现。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring> using namespace std; const int MaxN = 7, MaxS = 100000; int n, S;
int A[MaxN], B[MaxN]; typedef long long LL; LL Ans;
LL f[MaxS + 5]; void DFS(int x, int k, int Sum) {
if (Sum < 0) return;
if (x == 5) {
if (k & 1) Ans -= f[Sum];
else Ans += f[Sum];
return;
}
DFS(x + 1, k + 1, Sum - (A[x] + 1) * B[x]);
DFS(x + 1, k, Sum);
} int main()
{
for (int i = 1; i <= 4; ++i) scanf("%d", &B[i]);
scanf("%d", &n);
f[0] = 1;
for (int i = 1; i <= 4; ++i) {
for (int j = B[i]; j <= MaxS; ++j) {
f[j] += f[j - B[i]];
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= 4; ++j) scanf("%d", &A[j]);
scanf("%d", &S);
Ans = 0ll;
DFS(1, 0, S);
printf("%lld\n", Ans);
}
return 0;
}
[BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】的更多相关文章
- bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理
题目链接 1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1706 Solved: 985[Submit][ ...
- BZOJ1042:[HAOI2008]硬币购物(DP,容斥)
Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. Input 第一 ...
- BZOJ 1042: [HAOI2008]硬币购物 容斥+背包
1042: [HAOI2008]硬币购物 Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请 ...
- BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )
先按完全背包做一次dp, dp(x)表示x元的东西有多少种方案, 然后再容斥一下. ---------------------------------------------------------- ...
- Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp
1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1747 Solved: 1015[Submit][Stat ...
- BZOJ 1042: [HAOI2008]硬币购物 [容斥原理]
1042: [HAOI2008]硬币购物 题意:4种硬币.面值分别为c1,c2,c3,c4.1000次询问每种硬币di个,凑出\(s\le 10^5\)的方案数 完全背包方案数? 询问太多了 看了题解 ...
- BZOJ 1042 [HAOI2008]硬币购物(完全背包+容斥)
题意: 4种硬币买价值为V的商品,每种硬币有numi个,问有多少种买法 1000次询问,numi<1e5 思路: 完全背包计算出没有numi限制下的买法, 然后答案为dp[V]-(s1+s2+s ...
- bzoj 1042: [HAOI2008]硬币购物【dp】
设f[i]为凑i元的方案数,这个随便dp一下就行了 然后处理限制,我们考虑用容斥,也就是4个超限-3个超限+2个超限-1个超限,这里用状压枚举一下,然后i硬币超限就当做选了d[i]+1个,在s里减去, ...
- bzoj 1042: [HAOI2008]硬币购物【容斥原理+dp】
当然是容斥啦. 用dp预处理出\( f[i] \),表示在\( i \)价格时不考虑限制的方案数,转移方程是\( f[i]+=f[i-c[j]] \),用状压枚举不满足的状态容斥一下即可. #incl ...
随机推荐
- 如何优化cocos2d程序的内存使用和程序大小:第二部分_(转)
减少你的程序的大小 把纹理的颜色位深度减少到16位,不仅可以减少内存压力,还可以有效地减少程序的体积.但是,我们还有其它方法可以更进一步地减少程序的大小. TexturePacker PNG 图片优化 ...
- HDU--5280(dp或枚举)
官方题解: 这个题有非常多O(n2)的算法.这里说一种:枚举每个区间,在枚举区间的同一时候维护区间内的最小值和区间和,将最小值与P的大小进行比較,贪心地取最大值就可以.注意若枚举到的区间是整个数组,则 ...
- POJ1330Nearest Common Ancestors——近期公共祖先(离线Tarjan)
http://poj.org/problem? id=1330 给一个有根树,一个查询节点(u,v)的近期公共祖先 836K 16MS #include<iostream> #includ ...
- 解决Shockwave flash在chrome浏览器上崩溃的问题
越来越多的人開始使用chrome浏览器,非常多用户都遇到过flash崩溃的问题,有时候重新启动chrome能够解决,有时候会导致无法用chrome打开不论什么站点上的不论什么flash.这个问题非常少 ...
- iOS-Storyboad动态刷新
iOS-Storyboad动态刷新 什么叫做Storyboard动态刷新 在项目开发中,如果可以在xib(storyboard)中,动态显示运行效果图,那么实在是太爽了.在Xcode 6之后就为我们提 ...
- oracle过滤分割字符串自定义函数
该函数实现过滤前后的指定的字符串,诸如过滤分隔符等.可用于过滤字符串中的逗号分割符.特别说明:substr()函数支持从字符串倒数开始读取,例如: dbms_output.put_line( subs ...
- NetworkOnMainThreadException
来自:http://www.2cto.com/kf/201402/281526.html NetworkOnMainThreadException extends RuntimeException j ...
- Unity3D GUI之自定义风格组件
GUI中可以使用一些默认的组件,里面的最后一个参数一般情况下,不设置就是默认的 ,当然也可以进行手动的指定,比如: GUI.Button(new Rect(0,0,100,100),"开始游 ...
- 我的网站终于连续一星期,ip数1000以上了
相信每个程序员都有一个站长梦,我也是如此.说来惭愧,从2015年4月份开始,我投入了50块的域名费用,50块的空间费用,现在才回本. 由于终于从百度联盟的手里赚了一百块,按耐不住的菜鸟之冲动,于是决定 ...
- zabbix 基于JMX的Tomcat监控
zabbix 基于JMX的Tomcat监控 一.环境 ubuntu14.04 LTS Java 1.7.0 zabbix 2.4.5 二.安装配置 1.安装JavaGateway 在ubuntu14. ...