用動態規劃求解 0 1揹包問題

2021-09-03 09:00:04 字數 2210 閱讀 9160

今天下午又把 0-1 揹包問題看了下,發現之前的寫法雖然答案正確,但是和動態規劃的思想相關度不大。不是想當然地從乙個二維陣列的 [0][0] 元素開始求解。

直接放上**吧,因為已經寫得很詳細了。

其中 weight 是儲存了每件物品重量的 vector,value 是儲存了每件物品價值的 vector,c 表示揹包容量。

/**

最優子結構:問題的最優解包含了其子問題的最優解

重疊子問題:用來解原問題的遞迴演算法可以反覆地解同樣的子問題,而不是總在產生新的子問題。

當乙個遞迴演算法不斷地呼叫同一問題時,我們說該最優問題包含重疊子問題

自底向上求解問題:利用最優子結構性質,遞迴地從子問題的最優解逐步構造出整個問題的最優解

*/#include

#include

using

namespace std;

class

knapsack

/*揹包容量為0時,價值為0*/

for(

int i=

0; i<=n;

++i)

maxvalue[i][0

]=0;

/*沒有物品的時候,價值也為0*/

for(

int i=

0; i<=c;

++i)

maxvalue[0]

[i]=0;

//求出第一列的值,即揹包容量為1

for(

int i=n; i>0;

--i)

//求出最後一行的值,即只有一件物品 n

for(

int i=c; i>0;

--i)

/*maxvalue[i][j] 是揹包容量為j,可選物品為 i, i+1, ..., n時0-1揹包問題的最優值*/

/*自底向上求解問題*/

for(

int j=

1; j<=c;

++j)}}

return maxvalue[1]

[c];}}

;int

main()

;int v[4]

=;vector<

int>

weight

(w, w+4)

; vector<

int>

value

(v, v+4)

;int c =9;

knapsack kp;

int maxweight = kp.

knapsack

(weight, value, c)

; cout << maxweight << endl;

return0;

}

晚上上完演算法課,看到有另一種寫法,好像和我之前在別人的部落格上說的思想相似。回來又看了下,發現原來是對 maxvalue[i][j] 的理解不同:在上面的寫法中,maxvalue[i][j] 被解釋為 「揹包容量為j,可選物品為 i, i+1, …, n時0-1揹包問題的最優值」,這通常來說是一種反向思維。

而我也可以這樣理解:maxvalue[i][j] 是 「揹包容量為j,可選物品為 1, 2, 3, …, i 時的最優值」,這樣**寫起來反而更易理解。

兩種方法的遞迴式如圖:

按第二種理解時的**如下:

#include

#include

using

namespace std;

class

knapsack}}

return maxvalue[n]

[c];}}

;int

main()

;int v[4]

=;vector<

int>

weight

(w, w+4)

; vector<

int>

value

(v, v+4)

;int c =9;

knapsack kp;

int maxweight = kp.

knapsack

(weight, value, c)

; cout << maxweight << endl;

return0;

}

用動態規劃求解0 1揹包問題

0 1揹包問題描述 有n件物品和乙個重量為m的揹包。每種物品均只有一件 第i件物品的重量是w i 價值是p i 求解將哪些物品裝入揹包可使價值總和最大。動態規劃的基本思想 將乙個問題分解為子問題遞迴求解,且將中間結果儲存以避免重複計算。通常用來求最優解,且最優解的區域性也是最優的。求解過程產生多個決...

01揹包問題 動態規劃求解

時間限制 1 sec 記憶體限制 128 mb 提交 48 解決 17 給定n種物品和乙個揹包,物品i的重量是wi,其價值為vi,問如何選擇裝入揹包的物品,使得裝入揹包的物品的總價值最大?在選擇裝入揹包的物品時,對每種物品i只能有兩種選擇,裝入或者不裝入,不能裝入多次,也不能部分裝入。第一行輸入物品...

0 1揹包問題,動態規劃求解

1.什麼是0 1揹包問題?有n個物品,它們有各自的體積和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?舉例int v 每個物品對應的價值 int w 每個物品對應的重量 int bag 10 揹包最大承重10 0 1揹包問題 public static void main st...