完全揹包求最大價值的思路以及優化詳解

2021-10-25 10:11:18 字數 1153 閱讀 8938

有 nn 種物品和乙個容量是 vv 的揹包,每種物品都有無限件可用。

第 ii 種物品的體積是 vivi,價值是 wiwi。

求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。

輸出最大價值。

輸入格式

第一行兩個整數,n,vn,v,用空格隔開,分別表示物品種數和揹包容積。

接下來有 nn 行,每行兩個整數 vi,wivi,wi,用空格隔開,分別表示第 ii 種物品的體積和價值。

輸出格式

輸出乙個整數,表示最大價值。

資料範圍

0輸入樣例

4 5

1 22 4

3 44 5

輸出樣例:

10
dp[i][j]表示前i個物品湊成體積為j的最大價值, 轉移方程為:

dp[i][j] = max(dp[i-1][j], dp[i-1][j-1*v[i] + w[i] ,dp[i-1][j-2*v[i]] + 2* w[i], dp[i-1][j-3*w[i]] + 3*w[i], .... )

由於每種物品可以嘗試選擇無限多次,那麼就需要列舉每乙個物品選擇的次數,所以如果直接做,時間複雜度就是o(n^3)

注意到下面等價變形:

dp[i][j-v[i]] = max(dp[i-1][j-w[i]], dp[i-1][j-2*v[i] + w[i] ,dp[i-1][j-3*v[i]] + 2* w[i], dp[i-1][j-4*w[i]] + 3*w[i], ....)

帶入到原來的等式有:

dp[i][j]  = max(dp[i-1][j], dp[i][j-v[i]+w[i])

用這個dp方程遞推,時間複雜度降低為o(n^2)

下面做一步優化,去掉第一維i

我們發現,直接替換掉i,上面的等式依然可行,最後的**:

#includeusing namespace std;

const int n = 1010;

int dp[n];

int v[n], w[n];

int main()

for(int i=1;i<=n;i++)

}cout<}

完全揹包問題的優化

有 n 種物品和乙個容量為 v 的揹包,每種物品都有無限件可用。放入第 i 種物品的體積是 ci,價值是 wi。求將哪些物品裝入揹包,可使這些物品的耗費的費用總和不超過揹包容量,且重量總和最大。首先,要將 ci 大於 v 的物品剔除。其次,對於任意正整數 i 和 j,如果有 ci cj 且 wi w...

1060 揹包6(含價值的填滿型 完全 揹包)

時間限制 1 sec 記憶體限制 128 mb 提交 195 解決 130 提交 狀態 討論版 題目描述 問題描述 乙個特別的單行街道在每公里處有乙個汽車站。顧客根據他們乘坐汽車的公里使來付費。例如下表就是乙個費用的單子。kilometres price 沒有一輛車子行駛超過10公里,乙個顧客打算行...

看懂0 1揹包與完全揹包的空間優化

0 1揹包的主要思路就是 這件物品,取還是不取。用乙個二維陣列dp i v 來表示對第i個物品,揹包容量為v時的情況。c i 表示第i件物品的體積,w i 表示第i件物品的價值。那麼考慮第i件物品取與不取 如果不取,那麼就可以轉化為i 1件物品 容量仍然為v 價值沒有增加的情況 dp i 1 v 如...