動態規劃 01揹包問題

2021-10-03 22:06:42 字數 2560 閱讀 1990

參考:[[

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能否單獨放進揹包:

—如果不能,那麼備選為a,b時最大值,等於備選只有a時的最大值(因為b是放不進揹包的)。

—如果能,即b能夠放進去,還有兩種可能(即將b放進揹包,和不將b放進揹包),對這兩種可能性,要取最大值:

---------最終將b放進去(注:此時物品a是否被放進揹包是未知的,原因是:剩餘的揹包容量可能不足以放進物品a,即要在剩餘可選物品裡找出最優解。

---------最終沒有將b放進去(因為後面可能有比b更合適的物品放進去),此時最大值等於備選只有a時的最大值

引自原文

簡單來說我們要思考的是第i個物品是否放進揹包

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的情況下,最...