0 1揹包問題 動態規劃 解釋與C語言實現

2021-10-05 03:45:19 字數 2489 閱讀 4779

動態規劃

物品數n=5,揹包容量c=10。

物品重量序列w=,物品價值序列v=。

求最佳裝包序列。

//假設簡單題目:揹包容量5,物品abca

bc重量2

34價值2

23(可以直接推出:選ab價值總和最高,可最後驗證是否正確)

//表橫軸為揹包當前容量12345、縱軸為物品序號abc。

//**內容意義為當前容量(橫軸)的最優價值

1. 將第一行第一列設為0.01

2345

0000

000a

0b0c

02. 從(1,a)處開始填數,

b過程:如果該物品質量(abc)小於等於揹包容量(123456…)

該步驟完成可得下表:題目參考: abc重量分別為234、價值分別為2230

1234

5000

0000

a002

222b

0022

25c0

0233

5//舉例:例如(5,b)格的5是怎麼來的:

到a過程

到b過程:

//舉例:例如(5,c)格的5是怎麼來的:

到a過程

到b過程:

//起點設定在右下角

b.如果該格 與 上面一格價值不同

則將當前物品記錄到 選中的集合 中

然後找到左邊 (當前容量減去當前物品重量) 的揹包容量處

接著回到第a步,一直到邊界

//過程如下(深綠色為要取的物品,要記錄的值。淡綠色為移動過程)

先構造動態規劃表,然後回溯獲得最優解。

#include

#define max_size 5

//物品數量

#define bag_size 10

//揹包容量

intmain()

;//重量

int v[max_size ]=;

//價值

int table[max_size +1]

[bag_size +1]

;//table表定義 每個元素都是當前容量下揹包的最優價值

int yes[max_size]

;//選中的物品集

int yes_size =0;

//選中集大小

//建立 表

for(

int i =

0; i <= max_size; i++

)//i是商品序號 從1開始

for(

int j =

0; j <= bag_size; j++)if

(w[i-1]

> j)

table[i]

[j]= table[i -1]

[j];

//如果質量大於揹包容量,則不放入。 現行揹包總價值為之前的價值

else

table[i]

[j]= table[i -1]

[j]>

(table[i -1]

[j - w[i-1]

]+ v[i-1]

)? table[i -1]

[j]:

(table[i -1]

[j - w[i -1]

]+ v[i -1]

);//如果質量小於等於揹包容量,則判斷價值大小

//(裝自己的重量)的最優價值a 與 (不裝自己的重量)的最優價值b

//即a = (當前揹包容量j減去當前物品重量(自重)的容量w)所對應價值,即上面**那個容量w對應的價值

//再加上自己的價值。

//即b = 不放自己的價值,即上面**的價值。

}//接下來回溯table表獲取選中的物品

int i = max_size;

//縱軸物品最下側

int j = bag_size;

//橫軸容量最右側

while

(i >

0&& j >0)

printf

("被選中的物品有:\n");

for(

int i =

0; i < yes_size; i++

)printf

("重量為%d,價值為%d的物品\n"

, w[yes[i]

], v[yes[i]])

;//迴圈輸出剛才選中的物品

動態規劃揹包問題 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的情況下,最...