背包问题

您所在的位置:网站首页 特殊背包不能加子弹 背包问题

背包问题

2024-07-02 13:22| 来源: 网络整理| 查看: 265

树形dp----分组背包+依赖背包 分组背包1.定义2.讲解3.练习题 依赖背包1.定义2.讲解3.练习题

分组背包 1.定义

分组背包,通俗的讲就是,给你N组物品,然后每一组你至多选择一个物品(也可以不选),每个物品都有自己的体积和价值,现在给你一个容里为M的背包,让你用这个背包装物品,使得物品价值总和最大.

2.讲解

其实就类似于01背包,对于一个物品有两种决策选或不选,但是分组背包是在01背包的基础上对物品进行了分组,并且每一组只能最多选择一个物品,所以我们不妨用01背包的思想去思考分组背包.

分析:我们设f[i][j]为当前考虑到了第i组物品,剩余容里为j的背包能装物品的最大价值,那么很容易想到我们需要去枚举第i组物品,考虑选哪一个物品时最优的(或者不选),状态转移方程就是 i f ( j > = v [ i ] [ k ] ) f [ i ] [ j ] = m a x ( f [ i ] [ j ] , f [ i − 1 ] [ j − v [ i ] [ k ] ] + w [ i ] [ k ] ) if(j>=v[i][k]) f[i][j] = max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]) if(j>=v[i][k])f[i][j]=max(f[i][j],f[i−1][j−v[i][k]]+w[i][k]),v[i][k]和w[i][k]分别表示第i组物品中第k个物品的体积和价值

代码:

for(int i=1;in>>m) { if(!n&&!m) break; memset(f,0,sizeof(f)); /*w[i][j]表示在i课程上花j天学习所获得的价值*/ for(int i=1;iw[i][j]; for(int i=1;i=0;j--) for(int k=1;k=k)//剩余的背包容量j还够学习k天的话 { f[j] = max(f[j],f[j-k]+w[i][k]); } coutn>>m; for(int i=1;ik; for(int j=1;j>A>>C; build(i,A,C); } } for(int i=n-m+1;i>val[i]; dfs(1); for(int i=m;i>=0;i--) { if(f[1][i]>=0) { coutn>>m; for(int i=1;iu>>w[i]; build(u,i); } w[0] = 0; dfs(0); cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3