其他分享
首页 > 其他分享> > 分组背包(背包问题)

分组背包(背包问题)

作者:互联网

分组背包:

1.定义

(1)分组背包,通俗的讲就是,给你N组物品,然后每一组你至多选择一个物品(也可以不选),每个物品都有自己的体积和价值,现在给你一个容里为M的背包,让你用这个背包装物品,使得物品价值总和最大.
(2)其实就类似于01背包,对于一个物品有两种决策选或不选,但是分组背包是在01背包的基础上对物品进行了分组,并且每一组只能最多选择一个物品,所以我们不妨用01背包的思想去思考分组背包.

2.思路

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

for(int i=1;i<=n;i++)
for(int j=0;j<=m;j--)
for(int k=1;k<=s[i];k++)//s[i]表示第i组物品的个数
if(j>=v[i][k])//剩余的背包容量j大于第i组的第k个物品的体积
{
	f[i][j] = max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]);
}

标签:背包,容里,不选,问题,01,分组,物品
来源: https://blog.csdn.net/weixin_52513845/article/details/122486923