用滾動陣列求解0 1揹包問題

2021-10-06 06:12:58 字數 600 閱讀 7097

//

由於第i個階段(考慮物品i)的解dp[i][ * ]只與第i-1個階段(考慮物品i-1)的解dp[i-1][ * ]有關,這種情況下儲存更前面的資料已經毫無意義。

因此可以利用滾動陣列進行優化,將dp陣列由dp[maxn][maxn]改為dp[2][maxn]。

因此0/1揹包問題的狀態轉移方程如下:

dp[0][0]=0,dp[1][0]=0

dp[0][r]=0

dp[c][r]=dp[1-c][r] (當r**實現:

#include

#define maxn 20

#define maxw 100

int n=

5,w=10;

int w[maxn]=;

int v[maxn]=;

int dp[1]

[maxw]

;int

max(

int a,

int b)

void

knap()

}}intmain()

參考自《演算法設計與分析》第二版 李春葆

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

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

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

今天下午又把 0 1 揹包問題看了下,發現之前的寫法雖然答案正確,但是和動態規劃的思想相關度不大。不是想當然地從乙個二維陣列的 0 0 元素開始求解。直接放上 吧,因為已經寫得很詳細了。其中 weight 是儲存了每件物品重量的 vector,value 是儲存了每件物品價值的 vector,c 表...

揹包九講 01揹包問題(dp 滾動陣列)

現在有n件物品和乙個容量為v的揹包。第i件物品的費用是cost i 價值是value i 每個物品最多只能選一次,求解在不超過揹包容量的限制下,如何選取物品組合能使收益最大化?題型有兩種,一種要求揹包恰好放滿,一種不要求揹包恰好放滿 現在考慮第二種題型,即不要求揹包恰好放滿 將問題分解成子問題 有i...