混合背包问题包括了三种背包, 01 01 01 背包,完全背包,多重背包,首先我们需要了解他们之间的关系,不难发现,我们可以将 01 01 01 背包和多重背包一起处理, 01 01 01 背包就是 s = 0 s = 0 s=0 的多重背包,所以完全背包就直接套板子
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 给减掉,防止遗漏