有 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 如...