//
由於第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...