背包九讲之七(有依赖的背包问题)
2015-02-08 18:24
218 查看
/* 即物品间存在依赖,比如i依赖于j,表示若选物品i,则必须选物品j http://acm.hdu.edu.cn/showproblem.php?pid=3449 有很多个箱子,想买箱子中的物品必须先买下箱子,典型的依赖背包 将不依赖其他物品的物品称为主件,依赖其他物品的物品称为附件 我们有n个箱子,箱子里面的物品个数为cnt[i] 那么箱子称为主件,箱子里面的物品称为附件 那么考虑一个主件和它附件的集合,那么有2^n+1种策略,每种策略都是互斥的。所以它是分组背包问题。 但是不能像一般的分组背包那样处理,因为组内有2^n+1种。 但是考虑到费用相同时,只选择价值最大的。所以可以对组内的附件进行01背包,得到费用依次为v-c[i]...0的最大价值 dp2[v-c[i]...0] */ #include <stdio.h> #include <string.h> int dp[100000+10],dp2[100000+10]; int box[55],cnt[55],price[55][11],value[55][11]; inline int max(const int &a, const int &b) { return a < b ? b : a; } int main() { int n,v,i,j,k; while(scanf("%d%d",&n,&v)!=EOF) { memset(dp,0,sizeof(dp)); for(i=1; i<=n; ++i) { scanf("%d%d",&box[i],&cnt[i]); memcpy(dp2,dp,sizeof(dp)); for(j=1; j<=cnt[i]; ++j) { scanf("%d%d",&price[i][j],&value[i][j]); for(k=v-box[i]; k>=price[i][j]; --k)//附件进行01背包,每个dp2[k]对于组内的一种策略 dp2[k] = max(dp2[k],dp2[k-price[i][j]]+value[i][j]); } for(k=box[i];k<=v; ++k) dp[k] = max(dp[k],dp2[k-box[i]]);//当容量为k时,取第i组的物品时得到的最大值和不取比较哪个大 } printf("%d\n",dp[v]); } return 0; }
相关文章推荐
- 有依赖的背包问题(背包九讲)
- 【背包九讲】P07: 有依赖的背包问题
- 有依赖的背包问题(背包九讲)
- [转载]背包问题九讲(九)
- 背包九讲 01背包问题 02背包问题 .........
- 背包问题九讲(转)
- 背包问题九讲(1)
- sicily 1346 金明的预算方案 有依赖的背包问题
- [转载]背包问题九讲(七)
- 【转】背包九讲——多重背包问题 ,二维费用背包
- 背包问题九讲 v1.0
- [转载]背包问题九讲(三)
- 背包问题总结第八讲——有依赖的背包问题
- [转载]背包问题九讲(四)
- [转载]背包问题九讲(五)
- 背包问题九讲(转)
- 背包问题九讲(转)
- 背包问题九讲
- 背包九讲 P02: 完全背包问题
- [转载]背包问题九讲(二)