理解子集和来解决资源分配问题

时间:2014-10-23 22:29:54

标签: java c++ algorithm pseudocode

我在互联网上发现了这个代码,我很难理解它。任何人都可以给出一些解释,这将非常有帮助。

  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]

1 个答案:

答案 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]描述了包含以全局容量开头的所有项目的最佳解决方案。