背包九讲第一章
0—1背包问题
转移方程
其中v[i]代表i件物品的质量,w[i]代表i件物品的价值。
f[i][j] = max{f[i - 1][j], f[i - 1][ j - v[i] ] + w[i]}
举个栗子!
假设我们有两个物品:
序号 1 2 3
V(质量) 2 3 5
W(价值) 5 8 12
好!假设我们现在有个背包,背包的容量为5,问最多能装下的价值是多少?

由于作者不会制图,弄个excel大家看看吧,黄色的表格代表拿去这件物品,白色表格表示不拿取。
如果:大家细心的话,应该发现这明明就是个递归问题,所以我们可以运用动态规划去优化这个递归树,至于如何将递归树转化为动态规划的二维数组我就不在这做详解了(作者承认现在作者也不知道如何去描述这个问题)。(就是自己明白但是说不出,呜呜~~)
其实要是改成递归去做我觉得大家可能更好理解
Find(i , j) = max ( F(i - 1, j) , F(i - 1)( j - v[i]) + w[i])
这个题目每一步我们都有两种选择,要么拿取第这件物品,要么不拿这件物品。
如果拿取:f[i][j] = f[i - 1][j - v[i] ] + w[i]
如果不拿:f[i][j] = f[i - 1][j]
//核心代码:
for(int i = 1; i <= n(物品数量); ++i)
for(int j = 0; j <= m(物品质量); ++j)
{
f[i][j] = f[i - 1][j];
if(j >= v[i])
f[i][j] = f[i - 1][j - v[i] ] + w[i];
}
835

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



