1. 程式人生 > >動態規劃 —— 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)如果第ii個物品的重量大於揹包的容量,則裝人前ii個物品得到的最大價值和裝入前i1i−1個物品得到的最大價是相同的,即物品ii不能裝入揹包。得 value(i,j)=value(i1,j)value(i,j)=value(i-1,j)

(2)如果第ii個物品的重量小於揹包的容量,則會有一下兩種情況: (1)如果把第ii個物品裝入揹包,則揹包物品的價值等於第i

1i−1個物品裝入容量為jwij−w_i的揹包中的價值加上第ii個物品的價值viv_i; (2)如果第i個物品沒有裝入揹包,則揹包中物品價值就等於把前i1i−1個物品裝入容量為