1. 程式人生 > >第三講 多重背包問題(對背包九講的學習)

第三講 多重背包問題(對背包九講的學習)

題目 利用 截圖 每次 alt 超出 src col mil

題目

有N種物品和一個容量為V的背包。第i種物品最多有n[i]件可用,每件費用是c[i],價值是w[i]。求解將哪些物品裝入背包可使這些物品的費用總和不超過背包容量,且價值總和最大。

基本思路:

對每個物品都考慮拿幾個(這個很好理解)

遞推式:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}

時間復雜度是O(V*Σn[i])

轉換為為01背包問題:

這裏利用了二進制的性質優化

時間復雜度:O(V*Σlog n[i])

例子1:(註意看數字的顏色)

7個物品i的多重背包問題=01背包問題(物品1

=1個物品i,物品2=2個物品i,物品3=4個物品i,,,)

2^0+2^1+2^2=7  7-7=0,不用補了

例子2:

8個物品i的多重背包問題=01背包問題(物品1=1個物品i,物品2=2個物品i,物品3=4個物品i,物品4=1個物品i)//藍色地方是補到8

1+2+4=7 < 8    8-7=1,再1

註意每次選的時候還是要判斷是否空間超出了

例子3:

5個物品i的多重背包問題=01背包問題(物品1=1個物品i,物品2=2個物品i,物品3=2個物品i)//藍色地方是補到5

1+2=3<5  5-3=2,再補個2

比方說例子3我們看到了,物品1,物品2,物品3可以組合成0~5的任何數

這樣一來,就從多重背包轉換成了01背包

繼續優化:

圖片截圖自 背包九講

最後那個O(Vn)的方法我還沒學,先放著,以後其他學完了再學他

技術分享圖片

第三講 多重背包問題(對背包九講的學習)