01揹包是動態規劃中比較簡單的乙個問題,其中的關鍵在於找到狀態轉換方程。
假設編號分別為a,b,c,d,e的五件物品,重量分別是2,2,6,5,4,價值分別是6,3,5,4,6,現在有乙個承重為10的揹包,如何裝入物品具有最大價值?
首先假設有乙個國王且手下有大臣a和大臣b,聰明的國王將這個問題分為放入物品a和不放入物品a兩種情況。然後國王告訴大臣a假如已經放了物品a, 那麼剩下b,c,d,e四件商品放入大小為8的揹包中的最大價值(其中8來自於總重量10減去物品a的重量2),然後再告訴大臣b假如沒有放入物品a, 那麼在b,c,d,e四件商品中放入大小為10的揹包中的最大價值。
而國王只需要比較兩個大臣的答案就可以得到最終答案。大臣a採用同樣方法把任務分給手下有a1和a2兩個人,大臣b同理。依次下去,即可得到最終的答案。
以上可以看出,關鍵步驟是將問題分解為放入物品a與不放入物品a兩種情況中的最大值,並推廣的所有的物品。這也是01的由來。
用圖形表示出來就是下面這張表。
首先注意的是該表是至底向上,從左至右開始填的,左邊紫色列標示物品編號,並對應的有重量與價值,第一行標示揹包重量。(b, 5)表示b、c、d、e四個物品放入大小為5的揹包中的最大值。(a, 10)就是abcde五種商品放入容量為10的揹包中的最大價值,這正好就是題目的答案。
現在我們開始學怎麼填這張表,先隨便挑乙個**(a,9),此時揹包容量為9,可以選abcde五種物品,我們要找出容量的最大值,根據上述思路分為放入物品a和不放入物品a兩種情況。
情況a: 假如放入物品a, 則揹包容量變為9-2=7,還剩b,c,d,e四種物品。所以該情況下的最大值 = (b,7) + 物品a的價值6,即9+6
情況b: 假如不放入物品a, 揹包容量不變為9,還剩b,c,d,e四種物品。所以該情況下的最大值 = (b, 9),即10
所以現在(a, 9) = max( (b,7)+6, b(9) ) = max(9+6,10) = 15。
同樣的步驟填滿其他的**即可。
下面是js實現:
function packagemaxvalue(weight, value, size)
// 揹包的容量小於物品j的重量,那麼就沒有上述情況了
if(w < weight[j])
bagmatrix[w][j] = math.max((bagmatrix[w-weight[j]][j-1] || 0) + value[j], bagmatrix[w][j-1] || 0)}}
return bagmatrix
}let weight = [4, 5, 6, 2, 2]
letvalue = [6, 4, 5, 3, 6]
console.log(packagemaxvalue(weight, value, 10))
輸出結果:
[ [ 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0 ],
[ 6, 6, 6, 6, 6 ],
[ 6, 6, 6, 6, 6 ],
[ 6, 9, 9, 9, 9 ],
[ 6, 9, 9, 9, 9 ],
[ 6, 9, 9, 9, 12 ],
[ 6, 9, 9, 10, 12 ],
[ 6, 9, 11, 11, 15 ],
[ 6, 9, 11, 13, 15 ],
[ 6, 9, 14, 14, 15 ] ]
揹包問題 01揹包問題
n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...
揹包問題 01揹包
有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...
揹包問題(01揹包)
1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...