參考:[[
01揹包問題描述:有編號分別為a,b,c,d的n=4件物品,它們的重量w分別是2,3,4,5,它們的價值v分別是3,4,5,6,每件物品數量只有乙個,現在給你個承重為m=8的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?總和是多少?
結題思路是把該問題分解為乙個乙個的小問題,一步步的通過小問題的最優解,最終得到大問題的最優解。在這個問題中有兩個維度的變數,一是揹包的容量m,二是物品的種類數n,假如m=1,只有一種物品 a,最優解是什麼,有a,b兩種物品是最優解是什麼?以此類推。
1.首先,當物品種類n一定時,揹包容量越大,那麼最後的結果一定大於等於原來的值
2.其次,當揹包容量m一定時,物品種類n越多,最後的記過一定大於等於原來的值。
3.那麼,也就是說,我們想要求取的最大值也即是當m和n最大的時候的值。
假如當前有a和b兩種,m=1時,考慮a是否能夠放入,取得最大值,然後考慮a和b是否能放入,最終的情況可能只有a,或只有b或者ab都有。
對於b來說:
判斷b能否單獨放進揹包:簡單來說我們要思考的是第i個物品是否放進揹包—如果不能,那麼備選為a,b時最大值,等於備選只有a時的最大值(因為b是放不進揹包的)。
—如果能,即b能夠放進去,還有兩種可能(即將b放進揹包,和不將b放進揹包),對這兩種可能性,要取最大值:
---------最終將b放進去(注:此時物品a是否被放進揹包是未知的,原因是:剩餘的揹包容量可能不足以放進物品a,即要在剩餘可選物品裡找出最優解。
---------最終沒有將b放進去(因為後面可能有比b更合適的物品放進去),此時最大值等於備選只有a時的最大值
引自原文
c++**如下:
if
(j>=w[i]
) dp[i]
[j]=
max(dp[i-1]
[j-w[i]
]+v[i]
,dp[i-1]
[j])
;//dp[i][j]儲存i個物品,容量為j時的最大值
else dp[i]
[j]=dp[i-1]
[j];
解題**如下:
#include
using
namespace std;
int m,n;
//n是物品種類數,m是揹包容量
int w[
100]
,v[100];
long
long dp[
100]
[100];
intmain()
//上面的**可以計算出最值,輸出動態規劃表
for(
int i=
1;i<=n;i++)
cout<[m];
return0;
}
求出最大值後我們還要找出最後那幾個物品被放進了揹包,用回溯的方法來尋找最後解,思路如下
首先,判斷dp[i][j]與dp[i-1][j-w[i]]+v[i]是否相等:
– 如果相等,則說明第i個物品沒有放進揹包,則繼續回溯(i-1,j);、
– 否則就是進了揹包,則回溯到(i-1,j-w[i])
定義函式如下:
void
findmax
(int i,
int j)
else
if(j-w[i]
>=
0&& dp[i]
[j]==dp[i-1]
[j-w[i]
]+v[i]
)}
完整**:
#include
using
namespace std;
int m,n;
//n是物品種類數,m是揹包容量
int w[
100]
,v[100];
int item[
100]
;//標記是否被選中
long
long dp[
100]
[100];
//回溯最優解
void
findmax
(int i,
int j)
else
if(j-w[i]
>=
0&& dp[i]
[j]==dp[i-1]
[j-w[i]
]+v[i])}
//一直遍歷直到i=0為止
}int
main()
//上面的**可以計算出最值,輸出動態規劃表
for(
int i=
1;i<=n;i++
)//尋找最優解並輸出
findmax
(n,m)
;for
(int i=
1;i<=n;i++
) cout<<<
" "
;return0;
}
動態規劃揹包問題 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的情況下,最...