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