[英]understanding the subset sum to solve resource allocation
我在互聯網上找到了此代碼,我很難理解它。 誰能提供一些解釋將非常有幫助。
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]
分類
這是動態編程的典型應用。
變量
令w[i]
表示項目i
的權重, W
表示全局容量, M[i,w]
表示使用第一個i
對象和剩余容量w
子集和問題的最優解。
重點觀察
為了從先前的值M[i-1,*]
獲得最優解M[i,w]
,我們可以包括下一項i
或將其省略。 如果我們包含項目i
,則M[i,w] = w[i] + M[i-1, ww[i]]
(為包含項目i
添加權重w[i]
,但減少了剩余容量數量相同;涉及j
的幻燈片上有錯字。 如果我們將項目i
排除在外,則M[i,w] = M[i-1,w]
(不將任何值添加到先前的解決方案中,並保持相同的剩余容量)。
我們對最佳(最大)解感興趣,因此我們采用了這兩個值中的最大值。 無論如何,我們都減小了M[i,*]
的索引。 這意味着,如果我們知道值M[i',*]
,則可以為i > i'
計算值M[i,*]
。 這正是動態編程的思想。
注意
第一行是初始化,並且在值w[i]
大於剩余容量w
,我們顯然不能包括第i
項目。 返回值M[n,W]
描述了從全局容量開始包括所有項的最佳解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.