經典動態規劃問題 0 1揹包問題

2021-09-05 10:13:22 字數 1116 閱讀 2423

乙個揹包有一定的承重cap,有n件物品,每件都有自己的價值,記錄在陣列v中,也都有自己的重量,記錄在陣列w中,每件物品只能選擇要裝入揹包還是不裝入揹包,要求在不超過揹包承重的前提下,選出物品的總價值最大。

每個物品只有1個,給定物品的重量w價值v及物品數n和承重cap。請返回最大總價值。

狀態:dp[i][j]  儲存物品0,...i儲存到承重為j的揹包中的最大價值

邊界討論:

當i等於0時,也就是說只有乙個物品,重量為w[0],價值為v[0],那麼只有當j>= w[0]時,dp[0][j] = v[0];

當j等於0時,即揹包承重為0,不可能裝下任何物品,此時dp[i][0] = 0;

一般性的狀態討論:

對於當前的物品i,如果把這個物品裝入揹包(承重為j),揹包裡物品總價值是多少?

等於0,...i-1件物品的最大總價值+當前物品價值 也就是dp[i-1][j-w[i]]+v[i],注意此時留給0,...i-1物品的揹包承重為j-w[i],因為已經確定取索引為i的物品,這個物品會佔據w[i]的重量。

如果不裝入揹包(承重為j),揹包裡物品總價值為dp[i-1][j],也就是0,....i-1件物品放入承重為j的最大價值。

class backpack ;//dp[i][j]指的是0,...i件物品,裝到j承重的包中的最大價值

for(int k = 0;k <=cap;k++)

for(int i = 0;i=w[i])//剩餘承重可以放w[i]

dp[i][j] = (dp[i-1][j-w[i]]+v[i])> dp[i-1][j]?(dp[i-1][j-w[i]]+v[i]):dp[i-1][j];

else

dp[i][j] = dp[i-1][j];}}

return dp[n-1][cap];

}};

注意初始化時0-1揹包問題的限定,即當只能取第一件物品時,j>w[0]的所有情況都是一樣的,即揹包中只能放下一件物品。

動態規劃經典問題 01揹包問題

分解為子問題,尋找子問題間的依賴關係。第二行 肯定不選擇物品i 第三行 進行判斷是否選擇物品i。偽 用動態規劃解決揹包問題 public class backbag 填表 for int i 1 i n i else return opt n capacity return opt public s...

動態規劃揹包問題 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 首先我們考慮貪心策略,選取最大價...