BZOJ 1042: [HAOI2008]硬币购物
2014-09-01 12:45
357 查看
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1042
我是用多重背包水过的。。。正解是用容斥原理,枚举被限制的硬币。。。。
代码:
我是用多重背包水过的。。。正解是用容斥原理,枚举被限制的硬币。。。。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <stack> #include <string.h> #include <queue> #include <vector> #include <algorithm> #include <cassert> #include <set> #include <map> #include <cmath> #include <ctime> using namespace std; #define rep(i,a,b) for(int i=(a);i<(b);++i) #define rrep(i,a,b) for(int i=(a);i>=(b);--i) #define clr(a,x) memset(a,(x),sizeof(a)) #define eps 1e-8 #define LL long long #define mp make_pair const int maxn=100000+5; LL dp[maxn],tem[maxn]; LL sum[maxn]; inline void multipack(int amt,int cost,int n) { if(amt==0) return; rep(i,0,cost) tem[i]=sum[i]=dp[i]; int k=0; rep(i,cost,n+1) { tem[i]=dp[i]; if(k>=cost) k -= cost; sum[k] += dp[i]; if(i-(amt+1)*cost>=0) sum[k] -= tem[i-(1+amt)*cost]; dp[i] = sum[k]; ++k; } } int c[5],d[5]; int main() { // freopen("in.txt","r",stdin); int tot; while(scanf("%d%d%d%d%d",c,c+1,c+2,c+3,&tot)==5) { while(tot--) { int s; scanf("%d%d%d%d%d",d,d+1,d+2,d+3,&s); memset(dp,0,sizeof(LL)*(s+2)); dp[0]=1; rep(i,0,4) multipack(d[i],c[i],s); printf("%lld\n",dp[s]); } } }
相关文章推荐
- [bzoj1042][HAOI2008]硬币购物
- [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】
- BZOJ1042: [HAOI2008]硬币购物
- [BZOJ1042][HAOI2008]硬币购物-容斥原理
- 【bzoj1042】【HAOI2008】【硬币购物】【dp+容斥原理】
- 硬币购物 [Codevs1869,Bzoj1042,HAOI2008]
- [bzoj]1042: [HAOI2008]硬币购物
- Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp
- [BZOJ1042][HAOI2008]硬币购物
- bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理
- bzoj1042[HAOI2008] 硬币购物
- BZOJ 1042 [HAOI2008]硬币购物 - 容斥+DP
- [bzoj1042][HAOI2008][硬币购物] (容斥原理+递推)
- 【bzoj1042】 HAOI2008—硬币购物
- bzoj 1042 [HAOI2008]硬币购物
- bzoj1042 [HAOI2008]硬币购物
- bzoj 1042: [HAOI2008]硬币购物
- bzoj 1042: [HAOI2008]硬币购物【容斥原理+dp】
- BZOJ 1042: [HAOI2008]硬币购物 [容斥原理]
- BZOJ 1042: [HAOI2008]硬币购物【容斥】【01背包】