理解揹包問題

2021-06-22 14:27:46 字數 1987 閱讀 4270

揹包問題總共有九種,0-1揹包式所有的基礎,所以首先研究0-1揹包:

一、0-1揹包

問題陳述:有n件物品和乙個容量為v的揹包。第i件物品的費用是w,價值是v。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大若。

1、動態規劃解決

f[i,j]表示在前i件物品中選擇若干件放在承重為 j 的揹包中,可以取得的最大價值。

vi表示第i件物品的價值。

決策:為了揹包中物品總價值最大化,第 i件物品應該放入揹包中嗎 ?

題目描述:

有編號分別為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。

對於承重為8的揹包,a8=15,是怎麼得出的呢?

根據01揹包的狀態轉換方程,需要考察兩個值,

乙個是f[i-1,j],對於這個例子來說就是b8的值9,另乙個是f[i-1,j-wi]+vi;

在這裡,

f[i-1,j]表示我有乙個承重為8的揹包,當只有物品b,c,d,e四件可選時,這個揹包能裝入的最大價值

f[i-1,j-wi]表示我有乙個承重為6的揹包(等於當前揹包承重減去物品a的重量),當只有物品b,c,d,e四件可選時,這個揹包能裝入的最大價值

f[i-1,j-wi]就是指單元格b6,值為9,pi指的是a物品的價值,即6

由於f[i-1,j-wi]+pi = 9 + 6 = 15 大於f[i-1,j] = 9,所以物品a應該放入承重為8的揹包

根據以上的描述,實現c++**:

int one_zero_pack(int** c,int _value, int _weight, char flag,int m, int n)

//memset(c, 0, sizeof(c));

memset(flag, 0, sizeof(flag));

for(int i = 1; i <= n; ++i)

else if(j >= _weight[i])

else

}} }

int i = n, j = m;

while (c[i][j] != 0)

} return c[n][m];

}int main()

int max_value = one_zero_pack(c, values, weights, flags, max_weight, number);

cout << "需要放入的物品如下" << endl;

for (int i = 1; i <= 3; i++)

cout << "總的價值為: " << max_value << endl;

return 0;

}

2014.0702

下次繼續總結。。。

演算法 揹包問題理解

不知道您是否知道揹包問題。做這個題可以幫助您更好地理解遞迴演算法。題的內容是 乙個揹包可以裝下重量為weight的物品,現在有n件物品的集合s,其中物品的重量分別是w0,w1,w2 wn 1,問是否有一種物品組合,使得其重量剛好等於weight.p.s 如果您沒做過這個題,建議您先自己思考下,然後再...

揹包問題的自己理解

public static void print int a system.out.println 完全的揹包問題 public static void comlete int v,int w,int c,int m for int j w n j c j 後面裝入的物品要根據前乙個裝入的價值判斷是...

揹包01問題初理解

揹包問題 knapsack problem 是一種組合優化的np完全問題。問題可以描述為 給定一組物品,每種物品都有自己的重量和 在限定的總重量內,我們如何選擇,才能使得物品的總 最高。問題的名稱 於如何選擇最合適的物品放置於給定揹包中。具體理解可以直接通過下面的例子來理解揹包問題 揹包問題的乙個例...