混合背包问题包括了三种背包, 010101 背包,完全背包,多重背包,首先我们需要了解他们之间的关系,不难发现,我们可以将 010101 背包和多重背包一起处理, 010101 背包就是 s=0s = 0s=0 的多重背包,所以完全背包就直接套板子
状态表示 : f[i][j]:f[i][j]:f[i][j]: 在前 iii 个物品中选 且总体积不超过 jjj 的集合
状态属性 : 总价值的最大值
for(int j = m; j >= v; j -- )
f[j] = max(f[j], f[j - v] + w);
然后处理01背包和多重背包
if(s == - 1) s = 1;
for(int k = 1; k <= s; k *= 2)
{
for(int j = m; j >= k * v; j -- )
f[j] = max(f[j], f[j - k * v] + k * w);
s -= k;
}
if(s)
{
for(int j = m; j >= s * v; j -- )
f[j] = max(f[j], f[j - s * v] + s * w);
}
最后还要把剩下没有减完的 sss 给减掉,防止遗漏
655

被折叠的 条评论
为什么被折叠?



