揹包問題 I

2021-10-07 06:28:35 字數 788 閱讀 2123

在 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...