阅读此篇文章需要掌握01背包的状态转移方程:
f[i][j]:在前i件物品中选取总体积不超过j的物品,所得的最大价值(w[i]表示体积,v[i]表示价值)
f[i][j] = max(f[i-1][j], f[i-1][j-w[i]]+v[i])
上面这个方程不做过多解释,01背包问题还是很好理解的。
下面贴出01背包问题的代码以便于和下面要将的完全背包问题对比:
for (i = 1; i <= n; i++) //n为物品个数
{
for (j = 1; j <= w; j++) //w为背包总容量
{
if (j < w[i])
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
}
}
完全背包
我们已经知道完全背包问题与01背包唯一的不同就是每种背包有无限个,任意取。
f[i][j] = max(f[i-1][j], f[i-1][j-k*w[i]]+k*v[i]) (1 <= k <= w/w[i])
上面就是完全背包问题的初级状态转移方程,不难看出,f[i-1][j]为不取第i个物品,正好对应上式右边的k取0,所以我们把方程改写成: