(不想说第几天了==)混合背包
2017-10-10 19:52
218 查看
混合背包问题
将01背包,完全背包,多重背包混合起来,也就是有的物品可以取一次,或者可以取无限次,或者取得次数有一个上限。
有一个例题,是01背包的混合,感觉蛮有意思的~
AreYouBusy HDU - 3535
题意:有n个集合,每个集合有m件物品,每个物品有一个s值,如果s=0,表示这些物品最少取1个,s=1表示这些物品最多取1个,s=2,表示这些物品任意取.
将01背包,完全背包,多重背包混合起来,也就是有的物品可以取一次,或者可以取无限次,或者取得次数有一个上限。
for(int i=1;i<=n;i++) { if(第i件物品属于01背包) ZeroOnePack(c[i],w[i]); else if(第i件物品属于完全背包) CompletePack(c[i],w[i]); else if(第i件物品属于多重背包) MultiplePack(c[i],w[i],n[i]);
有一个例题,是01背包的混合,感觉蛮有意思的~
AreYouBusy HDU - 3535
题意:有n个集合,每个集合有m件物品,每个物品有一个s值,如果s=0,表示这些物品最少取1个,s=1表示这些物品最多取1个,s=2,表示这些物品任意取.
#include <iostream> #include <cstring> #include <cmath> #include <algorithm> #include <cstdio> #include <vector> using namespace std; #define inf 0x3f3f3f3f const int maxn = 105; int dp[maxn][maxn],c[maxn],v[maxn]; int main() { int n,T,m,s; while(scanf("%d %d",&n,&T)!=EOF) { memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { scanf("%d %d",&m,&s); for(int i=1;i<=m;i++) scanf("%d %d",&c[i],&v[i]); if(s==0) { for(int j=0;j<=100;j++) dp[i][j]=-inf; for(int b=1;b<=m;b++) for(int j=T;j>=c[b];j--) dp[i][j]=max(dp[i][j],v[b]+max(dp[i-1][j-c[b]],dp[i][j-c[b]])); } else if(s==1) { for(int j=0;j<=100;j++) dp[i][j]=dp[i-1][j]; for(int b=1;b<=m;b++) for(int j=T;j>=c[b];j--) dp[i][j]=max(dp[i][j],v[b]+dp[i-1][j-c[b]]); } else { for(int j=0;j<=100;j++) dp[i][j]=dp[i-1][j]; for(int b=1;b<=m;b++) for(int j=T;j>=c[b];j--) { dp[i][j]=max(dp[i][j],v[b]+dp[i][j-c[b]]); } } } if(dp [T]<0) dp [T]=-1; printf("%d\n",dp [T]); } return 0; }
相关文章推荐
- (不想说第几天了==)混合背包
- (不想说第几天了==)混合背包
- (不想说第几天了==)混合背包
- (不想说第几天了==)混合背包
- (不想说第几天了==)混合背包
- (不想说第几天了==)混合背包
- (不想说第几天了==)混合背包
- (不想说第几天了==)混合背包
- HDU3535 AreYouBusy 混合分组背包
- hdu 5410 CRB and His Birthday(混合背包)
- [HDU 3535] AreYouBusy (动态规划 混合背包 值得做很多遍)
- poj 1742(好题,楼天城男人八题,混合背包)
- P04: 混合三种背包问题
- 【codevs】3269 混合背包
- [codevs3269] 混合背包
- POJ 3260 The Fewest Coins / 混合背包
- 【codevs3269】混合背包 背包DP裸题
- codevs 3269 混合背包
- HDU 3535 AreYouBusy -- 分了组的混合背包
- HDU 3591 The trouble of Xiaoqian 混合背包(完全背包和多重背包混合)