0 1揹包問題(動態規劃)

2021-09-13 12:30:44 字數 1949 閱讀 1941

測試用例與輸出:

3 10

5 88 20

4 17

case 1: 1 3 25

思路:直接用動態規劃dp湊出最優解,做動態規劃一點要列印出遞推矩陣,方便理解。

一、資料

n 為物品個數,m為揹包重量,v陣列存物品價值,w存物品重量

bag為dp遞推矩陣第0行為全部初始化為0,ispush代表是否放入預設false

首先讀入以上資料

二、遞推矩陣

0  1  2  3  4   5   6   7   8   9  10  ==> j

0 [0, 0, 0, 0, 0 , 0 , 0 , 0 , 0 , 0 , 0]

1 [0, 0, 0, 0, 0 , 8 , 8 , 8 , 8 , 8 , 8]

2 [0, 0, 0, 0, 0 , 8 , 8 , 8 , 20, 20, 20]

3 [0, 0, 0, 0, 17, 17, 17, 17, 20, 25, 25]

i

1、以(1,1)為起點,從左到右,從上到下遍歷矩陣(遞推),第0行,第0列為皆為0,**如下    

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

}

助解:

當i=1時,代表第1件物品要放入揹包,最後推出1件商品時,揹包可以放下的最多價值。

當i=2時,代表前兩件物品要放入揹包,通過遞推公式,最後推出前2件商品,揹包可以放下的最多價值。

當i=3是,同理前3件物品。。。。

最後推出n件商品能放的最多價值

2、遞推矩陣填充資料,在每乙個bag[i][j],用以下遞推公式

if (j < w[i])//當要放入的東西超出揹包的容量

bag[i][j] = bag[i - 1][j];

else

最後得出得最遞推矩陣,bag[n][m] 的值為最後能放的最大價值

3、判斷放入那些物品,後bag[n][m]位置回溯,我們從遞推矩陣發現,如果我們放入物品,第i行與第i-1行同一列的值不一樣,此時j - w[i], 如果沒放,則第i行與第i-1行同一列的值是一樣的,j不變。每次都要i--,最後出口i=j=0(暫時想不出更好的**,下次想到再改改)

三、附上源**

#include"iostream"

#define max_i 100

#define max_j 1000

using namespace std;

int main()

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

}} //由後往前回溯

for (i = n, j = m; i > 0; i--)

} printf("case %d:", id++);

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

printf(" %d\n", bag[n][m]);

} return 0;}/*

0 1 2 3 4 5 6 7 8 9 10

3 10[0, 0, 0, 0, 0 , 0 , 0 , 0 , 0 , 0 , 0]

5 8[0, 0, 0, 0, 0 , 8 , 8 , 8 , 8 , 8 , 8]

8 20[0, 0, 0, 0, 0 , 8 , 8 , 8 , 20, 20, 20]

4 17[0, 0, 0, 0, 17, 17, 17, 17, 20, 25, 25]

*/

動態規劃揹包問題 01揹包

問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...

動態規劃 揹包問題 01揹包

有n種物品和乙個容量為v的揹包,每種物品僅用一次。第i件物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使價值總和最大。例如 n 5,v 10 重量 價值 第乙個物品 10 5 第二個物品 1 4 第三個物品 2 3 第四個物品 3 2 第五個物品 4 1 首先我們考慮貪心策略,選取最大價...

0 1揹包問題(動態規劃)

一 問題描述 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。所謂01揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。二 解決方案 考慮使用動態規劃求解,定義乙個遞迴式 opt i v 表示前i個物品,在揹包容量大小為v的情況下,最...