給定n種物品和乙個揹包。物品i的重量是w(i),其價值是v(i),揹包的容量為c。
問應該如何選擇裝入揹包中的物品,使得裝入揹包中物品總價值最大?
這裡主要是對《計算機演算法設計與分析(第三版)》中86頁後開始討論。
設m(i,j) 為在物品i~n中,在容量為j的情況下的最大價值
i=n時,可選的物品為n~n,所以只有第n個物品可以選
此時 m(n,j) = v(n) j>=w(n)
或 0 0<=j < w(n)
此時這個畫在座標系中是這樣子的:(注意這裡i已經為定值n了,此時已經不是變數)
注意到這裡有兩個跳躍點(0,0)和(w(n),v(n))
我們描述m(n,j)這個函式也就可以用這兩個跳躍點就可以了。
當i=n-1時,
m(n-1,j) = max
於是那本書引出這個遞推
m(i,j) = max
m(i,j)的值在m(i+1,j) 和 m(i+1,j-w(i))+v(i) 中最大值選擇。
繼續重申一遍,這裡i不是變數,只有j才是變數。
這個表示式表述出通俗點是什麼意思呢?
當m(i,j)等於m(i+1,j)時候,意思是加入第i件物品以供我們選擇後,最大價值卻跟沒加這件物品一樣,我們此時並沒有挑這件物品
而當m(i,j)等於 m(i+1,j-w(i))+v(i) 時候,我們是先挑中第i件商品,預算中先扣掉它,然後加上剩下的容量所能達到的最大值。
也就是說,計算m(i,j),我們會考慮這樣,一種是先不選第i件物品,然後它的最大價值就跟m(i+1,j)一樣。另一種是先挑下第i件物品 v(i),然後加上剩下的最大價值m(i+1,j-w(i))。
好了,之前我們提到跳躍點,我們記m(i+1,j)的跳躍點集合為p[i+1] 。集合裡面的元素表現形式為(j,m(i,j));
那麼m(i+1,j-w(i))+v(i)與m(i+1,j)的影象有什麼聯絡呢?
我們設m(i+1,j-w(i))+v(i)的跳躍點集合為q[i+1] 。
對乙個跳躍點(s,t)屬於q[i+1],則有
t=m(i+1,s-w(i))+v(i)
t-v(i) = m(i+1,s-w(i))
所以 (s-w(i),t-v(i))屬於p[i+1]。
這裡說明啥呢?其實q[n+1]點集合也是可以求出來的,q[n+1]中的元素(s,t)通過減法就是得到在p[n+1]中的元素(s-w(i),t-v(i))。
所以 q[i+1] = p[i+1] ⊕ (w(i),v(i))=
此時q[n+1] 和p[i+1]都求出來了。
那麼如何定義q[n]呢?
我們知道q[n]的跳躍點肯定在這兩個的並集中,是不是照單全收呢?
仔細思考一下,這裡是求其中的max,其實這兩個的函式影象層疊在一起的時候,我們可能在某個區間會去掉其中乙個,因為去掉的那個不夠max。
這也就是書上說的去掉受控點的意思。
p[i] = p[i+1] u q[i+1] 並且去掉受控點。
揹包問題 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...