在 n 個物品中挑選若干物品裝入揹包,最多能裝多滿?假設揹包的大小為 m,每個物品的大小為 a[i]
樣例 1:
輸入: [3,4,8,5], backpack size=10
輸出: 9
樣例 2:
輸入: [2,3,5,7], backpack size=12
輸出: 12
從已知的題目中,可以總結出以下兩點:
那麼考慮對於前 i 件的物品在容量為 w 的揹包下,最大的裝載量是多少,由此可以總結出對應的子結構,進行動態規劃。
總結狀態轉換方程為
n 表示物品件數,m表示揹包的容量
觀察上方的狀態轉義方程,可以發現dp[i][j]方程的兩個狀態都只和dp[i-1]有關,顯然通過
o(nm) 的空間複雜度,難免會浪費一些空間。
可以考慮使用滾動陣列優化,建立dp陣列 dp[m],使用 dp[j - a[i]] 代替 dp[i - 1][j - a[i]]。優化後狀態轉義方程為 dp[j] = max(dp[j], dp[j − a[i]] + a[i])
public
class
solution
int n = a.length;
int[
] dp =
newint
[m +1]
;for
(int i =
0; i < n; i++)}
return dp[m];}
}
多重揹包問題 I
有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行三個整數 vi...
多重揹包問題 I
有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行三個整數 vi...
多重揹包問題I
有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行三個整數 vi...