動態規劃 —— 01揹包
阿新 • • 發佈:2019-01-01
原理
- 動態規劃與分治法類似,都是把大問題拆分成小問題,通過尋找大問題與小問題的遞推關係,解決一個個小問題,最終達到解決原問題的效果。
- 但不同的是,分治法在子問題上被重複計算了很多次,而動態規劃則具有記憶性,通過填寫表把所有已經解決的子問題答案紀錄下來,在新問題裡需要用到的子問題可以直接提取,避免了重複計算,從而節約了時間。因而,分治法是一種遞迴演算法,動態規劃是一種非遞迴演算法。
- 動態規劃實質上是一種以空間換時間的演算法,它在實現的過程中,不得不儲存產生過程中的各種狀態,所以它的空間複雜度要大於其它的演算法。
01揹包問題描述
有n個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?
i | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
W(i) | 0 | 2 | 2 | 6 | 5 | 4 |
v(i) | 0 | 6 | 3 | 5 | 4 | 6 |
演算法思路
尋找遞推關係式,面對當前商品有兩種可能性:
(1)如果第個物品的重量大於揹包的容量,則裝人前個物品得到的最大價值和裝入前個物品得到的最大價是相同的,即物品不能裝入揹包。得
(2)如果第個物品的重量小於揹包的容量,則會有一下兩種情況: (1)如果把第個物品裝入揹包,則揹包物品的價值等於第個物品裝入容量為的揹包中的價值加上第個物品的價值; (2)如果第i個物品沒有裝入揹包,則揹包中物品價值就等於把前個物品裝入容量為