01揹包問題

2021-08-06 03:56:30 字數 1557 閱讀 7673

01揹包問題作為動態規劃經典案例,經常會在面試中會被問,這裡做個介紹。

問題描述:

定n個物品和乙個揹包。物品i的重量是wi,其價值位pi ,揹包的容量為c。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大,即:

在選擇物品的時候,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能將物品i裝入多次,也不能只裝入物品的一部分。因此,該問題被稱為0-1揹包問題。

問題分析:令v(i,j)表示在前i(1<=i<=n)個物品中能夠裝入容量為j(1<=j<=c)的揹包中的物品的最大價值,則可以得到如下的動態規劃函式:

(1)   v(i,0)=v(0,j)=0 

(2)   v(i,j)=v(i-1,j)  ji  

v(i,j)=max j>wi

(2)式第乙個表明:如果第i個物品的重量大於揹包的容量,則裝人前i個物品得到的最大價值和裝入前i-1個物品得到的最大價是相同的,即物品i不能裝入揹包;第(2)個式子表明:如果第i個物品的重量小於揹包的容量,則會有一下兩種情況:(a)如果把第i個物品裝入揹包,則揹包物品的價值等於第i-1個物品裝入容量位j-wi 的揹包中的價值加上第i個物品的價值vi;(b)如果第i個物品沒有裝入揹包,則揹包中物品價值就等於把前i-1個物品裝入容量為j的揹包中所取得的價值。顯然,取二者中價值最大的作為把前i個物品裝入容量為j的揹包中的最優解。

這裡舉例說明:

有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

name

weight

value12

3456

78910

a260

6699

1212

151515b

2303

3669

991011c6

5000

6666

61011d

5400

0666

661010e4

6000

6666

666只要你能通過找規律手工填寫出上面這張表就算理解了01揹包的動態規劃演算法。

首先要明確這張表是至底向上,從左到右生成的。

為了敘述方便,用e2單元格表示e行2列的單元格,這個單元格的意義是用來表示只有物品e時,有個承重為2的揹包,那麼這個揹包的最大價值是0,因為e物品的重量是4,揹包裝不了。

對於d2單元格,表示只有物品e,d時,承重為2的揹包,所能裝入的最大價值,仍然是0,因為物品e,d都不是這個揹包能裝的。

同理,c2=0,b2=3,a2=6。

**:

int v[100][100];//v[i][j]表示前i個物品選擇若干放入重為j的揹包可以取得的最大價值

int zero_one_pack(int n,int w,int p,int x,int c)

else x[i]=0;

}cout<

揹包問題 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...