動態規劃
物品數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的情況下,最...