0 1揹包問題

2021-08-07 21:35:46 字數 1629 閱讀 2843

給定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...