總結 動態規劃 01揹包 完全揹包

2021-08-17 13:59:00 字數 2103 閱讀 4291

前一段時間我學習了一下動態規劃裡面的01揹包和完全揹包,自己做了一些總結與大家分享一下,希望對你們有幫助

首先來說一下什麼是動態規劃

動態規劃就是把大問題拆分成小問題,通過尋找大問題與小問題的遞推關係,解決乙個個小問題,最終達到解決原問題的效果。通過填寫表把所有已經解決的子問題答案紀錄下來,動態規劃解決問題的核心就在於填表,表填寫完畢,最優解也就找到。

0-1揹包

問題描述:有n件物品和乙個容量為v的揹包。第i件物品的價值是v[i],重量是w[i]。求解將哪些物品裝入揹包可使價值總和最大。//具體問題:物品個數n=5,物品重量w[n+1]=,物品價值v[n+1]=,揹包的最大容量為10,

總體思路:求k問題的最優解,就要先求出k-1問題的最優解,以此類推,最後就轉化為求1問題的最優解,然後再往前推,那麼k問題的最優解就求出來了。總而言之,就是把每種狀態都求出來。

具體實現步驟:我畫了乙個表來幫助大家理解

然後將每種狀態都算出來,最後將表填完之後就是下面的結果。

最後資料date[ n ][ m ]就是這個問題的答案了。

**實現如下:

#include 

#include

#include

#include

using

namespace

std;

#define n 5

#define m 10

int date[n+1][m+1],w[n+1]=,v[n+1]=;

void dp()

printf("\n");

}}int main()

然後就是這個**可以進行改進,就是將儲存資料的二維陣列更改為一維的。關鍵性**更改如下:

for (i=1;i

<=n;i++)

for (j=m;j>=1;j--)

date[j]=max(date[j],date[j-w[i]]+v[i]);

完全揹包問題描述:有乙個容積為v的揹包,同時有n種物品,每種物品均有無數多個,並且每種物品的都有自己的體積和價值。求使用該揹包最多能夠裝的物品價值總和。// 具體問題: 物品種數n=4,物品重量w[n+1]=,物品價值v[n+1]=,揹包的最大容量為10.

總體思路:思路跟01揹包差不多,分解問題,求分解問題的最優解,因為完全揹包裡面,每種物品是無限多的,所以每次更新資料的時候還是對這種物品進行裝拿。

具體實現步驟:在這裡我還是採用打表來幫助理解

更新每一種狀態後

最後資料date[ n ][ m ]就是這個問題的答案了。

**實現如下:

#include 

#include

#include

using

namespace

std;

#define n 4

#define m 10

int date[n+1][m+1],w[n+1]=,v[n+1]=;

void dp()

printf("\n");

}}int main()

同樣的,這個**也可以進行改進,**更改如下:

for (i=1;i

<=n;i++)

for (j=w[i];j

<=m;j++)

date[j]=max(date[j],date[j-w[i]]+v[i]);

動態規劃 01揹包 完全揹包

有一類動態規劃可解的問題,它可以描述稱為若干有序的階段,且每個階段的狀態只和上乙個階段的狀態有關,一般把這類問題稱為多階段規劃問題。01揹包問題描述如下 有 n 件物品,每件物品的重量為 w i 價值為 c i 現有乙個容量為 v 的揹包,問如何選取物品放入揹包,使得揹包內物品的總價值最大。其中每種...

動態規劃 揹包問題(01揹包 完全揹包)

揹包問題 多種物品 重量不同 價值不同 你可以取最多重量不超過w的物品,問最大價值為多少?01揹包 指的是 有n個物品 每個物品的重量為w i 價值為v i 每個物品只有乙個 所有面臨這些物品只有兩種結果 1 拿這件物品,揹包容量減去w i 此時的價值增加v i 2 不拿這件物品,揹包容量不變,最大...

動態規劃之01揹包,完全揹包,多重揹包

01揹包問題,是用來介紹動態規劃演算法最經典的例子。f i,j 表示在前i件物品中選擇若干件放在承重為 j 的揹包中,可以取得的最大價值。pi表示第i件物品的價值。決策 為了揹包中物品總價值最大化,第 i件物品應該放入揹包中嗎 0 1的選擇 題目描述 有編號分別為a,b,c,d,e的五件物品,它們的...