給定n種物品和一揹包
wi :物品i的重量
vi :物品i的重量價值
c:揹包的容量
問:應如何選擇裝入揹包的物品, 使得裝入揹包中物品的總價值最大?
p[i][j]代表可選擇物品為前i個,揹包容量為j時的最大價值
當j=w[i]時我們需要判斷v[i]+p[i-1][j-w[i]]與p[i-1][j]的大小來對p[i][j]進行賦值
為什麼是判斷v[i]+p[i-1][j-w[i]]與p[i-1][j]呢
當j>w[i]時,我們可以裝入i,價值為v[i],此時容量為j-w[i],且物品到了第i-1個物品,所以p[i][j]可以為v[i]+p[i-1][j-w[i]]
同樣,我們也可以不裝入此物品,那麼此時去掉這個物品並沒有影響,就有p[i][j]=p[i-1][j]
由於p[i][j]代表揹包容量為j時的最大價值,所以需要比較兩種情況的最大值,並填入p[i][j]
用陣列s[i][j]記錄在容量為j的情況下是否選擇第i個物品
//p為最大價值,s為選擇與否
void
(int n,
int m,
int s[
][n]
)else
}int
main()
printf
("請輸入各物品的價值:");
for(i=
1;i<=n;i++
)for
(i=0
;i<=n;i++
)for
(i=0
;i<=m;i++
)for
(i=1
;i<=n;i++
)else
else}}
}printf
("最大價值為:%d\n選擇的物品為:"
,p[n]
[m])
(n,m,s)
;return0;
}
演算法 動態規劃0 1揹包問題
有乙個容量為 n 的揹包,要用這個揹包裝下物品的價值最大,這些物品有兩個屬性 體積 w 和價值 v。定義乙個二維陣列 dp 儲存最大價值,其中 dp i j 表示前 i 件物品體積不超過 j 的情況下能達到的最大價值。設第 i 件物品體積為 w,價值為 v,根據第 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 首先我們考慮貪心策略,選取最大價...