題目:給定n個專案的權重和價值(利潤),將這些專案放入最大容量w的揹包中,以獲得揹包中的最大總值(利潤)。
此時我們由這個問題得到了乙個子問題通用的解決方案,來檢查我得到的利潤
通過挑選專案或不挑選該專案這也就是選與不選的問題
當我選擇物品時,我需要將其從計算中移除,因為您已經對當前物品進行了處理,並通過拾取物品的重量減少了揹包容量。
當我不選擇物品時,我需要從計算中刪除它,因為你已經在當前物品上工作,並保持揹包的容量,因為此時我們還沒有選擇物品。
遞迴過程如下圖:
**如下:
int wt[maxn],val[maxn];
int knap(int w,int wt,int val,int n)
這種解法複雜度為指數級別,存在大量的重複計算。
令陣列dp[i][v]表示前i件物品在容量為v時,所獲得的最大價值,則狀態轉移方程為
其中w是物品的質量陣列,val為物品價值陣列。
**如下:
int w,n,wt[maxn],val[maxn],dp[maxn][maxv]; //w為總重量,n為物品總數
int knapsack(int w,int wt,int val,int n)
return dp[n][w];
}
dp優於遞迴的好處:
動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。
動態規劃背後的基本思想非常簡單。大致上,若要解乙個給定問題,我們需要解其不同部分(即子問題),再合併子問題的解以得出原問題的解。
通常許多子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,從而減少計算量:一旦某個給定子問題的解已經算出,則將其記憶化
儲存,以便下次需要同乙個子問題解之時直接查表。這種做法在重複子問題的數目關於輸入的規模呈指數增速時特別有用。
動態規劃揹包問題 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的情況下,最...