我在互联网上发现了这个代码,我很难理解它。任何人都可以给出一些解释,这将非常有帮助。
SubsetSum(n, W):
Initialize M[0,w] = 0 for each w = 0,...,W
Initialize M[i,0] = 0 for each i = 1,...,n
For i = 1,...,n: for every row
For w = 0,...,W: for every column
If w[i] > w: case where item can’t fit
M[i,w] = M[i-1,w]
M[i,w] = max( which is best?
M[i-1,w],
w[j] + M[i-1, W-w[j]]
)
Return M[n,W]
答案 0 :(得分:1)
<强>分类强>
这是Dynamic Programming的典型应用。
<强>变量强>
让w[i]
表示项目i
的权重,W
全局容量和M[i,w]
使用第一个i
的子集求和问题的最优解对象和剩余容量w
。
重点观察
要从之前的值M[i,w]
获取最佳解决方案M[i-1,*]
,我们可以包含下一个项i
或将其保留。如果我们添加了项i
,那么M[i,w] = w[i] + M[i-1, w-w[i]]
(为项目w[i]
添加权重i
,但将剩余容量减少相同的数量;有一个错字在涉及j
)的幻灯片上。如果我们将项目i
退出,那么M[i,w] = M[i-1,w]
(不向前一个解决方案添加任何值并保持相同的剩余容量)。
我们对最优(最大)解决方案感兴趣,因此我们取这两个值的最大值。无论如何,我们减少了M[i,*]
的索引。这意味着,如果我们知道值M[i',*]
,我们就可以为M[i,*]
计算值i > i'
。这正是动态编程的想法。
注意强>
第一行是初始化,如果值w[i]
大于剩余容量w
,我们显然不能包含项i
。返回值M[n,W]
描述了包含以全局容量开头的所有项目的最佳解决方案。