bzoj 1042: [HAOI2008]硬币购物
2017-09-07 21:41
344 查看
题意:一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买si的价值的东西。请问每次有多少种付款方法。
题解:DP+容斥
先暴力求出无限硬币时每种价钱的方案数,然后每个询问的答案=无限硬币的方案-超1种硬币的方案+超2种硬币的方案-超3种硬币的方案+超4种硬币的方案。每一种硬币超过限制的方案=f[s-(d[x]+1)*c[i]],相当于固定d[x]+1个硬币保证超过限制,然后剩下的随便组合。
代码:
题解:DP+容斥
先暴力求出无限硬币时每种价钱的方案数,然后每个询问的答案=无限硬币的方案-超1种硬币的方案+超2种硬币的方案-超3种硬币的方案+超4种硬币的方案。每一种硬币超过限制的方案=f[s-(d[x]+1)*c[i]],相当于固定d[x]+1个硬币保证超过限制,然后剩下的随便组合。
代码:
#include<cstdio> #include<cstring> #include<cstdlib> int c[4],d[4],n; long long f[100010],ans; void wk(int s,int x,int type) { if(x==4) { // printf("%d\n",f[s]*type); ans+=f[s]*type; return; } wk(s,x+1,type); if(s>=(d[x]+1)*c[x]) wk(s-(d[x]+1)*c[x],x+1,type*-1); } int main() { memset(f,0,sizeof(f)); scanf("%d%d%d%d%d",&c[0],&c[1],&c[2],&c[3],&n); f[0]=1; for(int i=0;i<4;i++) { for(int j=c[i];j<=100000;j++) { f[j]+=f[j-c[i]]; } }/* for(int i=0;i<100000;i++) { printf("%d",f[i]); system("pause"); }*/ for(int i=0;i<n;i++) { int s; for(int j=0;j<4;j++) scanf("%d",&d[j]); scanf("%d",&s); ans=0; wk(s,0,1); printf("%lld\n",ans); } }
相关文章推荐
- BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包
- [DP+容斥] BZOJ1042: [HAOI2008]硬币购物
- BZOJ1042: [HAOI2008]硬币购物
- 【BZOJ】1042: [HAOI2008]硬币购物(dp+容斥原理)
- 【BZOJ1042】【DP + 容斥】[HAOI2008]硬币购物
- Bzoj1042: [HAOI2008]硬币购物
- BZOJ1042:[HAOI2008]硬币购物 (容斥原理+DP)
- bzoj1042: [HAOI2008]硬币购物
- 【bzoj 1042】 [HAOI2008] 硬币购物(dp+容斥原理)
- 【BZOJ】1042 [HAOI2008]硬币购物 组合数学(容斥)
- BZOJ 1042: [HAOI2008]硬币购物 容斥+背包
- bzoj 1042 [HAOI2008]硬币购物
- BZOJ 1042 HAOI2008 硬币购物 背包+容斥原理
- bzoj 1042: [HAOI2008]硬币购物(dp+容斥)
- [bzoj 1042--HAOI2008]硬币购物
- Bzoj1042: [HAOI2008]硬币购物
- bzoj1042[HAOI2008]硬币购物
- BZOJ1042 [HAOI2008]硬币购物
- 【bzoj1042】[HAOI2008]硬币购物
- 【bzoj1042】[HAOI2008]硬币购物