1. 程式人生 > 其它 >多重揹包問題 I(動態規劃)

多重揹包問題 I(動態規劃)

多重揹包問題 I

有 N 種物品和一個容量是 V 的揹包。

第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。

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

輸入格式

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

接下來有 N 行,每行三個整數 vi,wi,si,用空格隔開,分別表示第 i 種物品的體積、價值和數量。

輸出格式

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

資料範圍

0<N,V100
0<vi,wi,si100

輸入樣例

4 5
1 2 3
2 4 1
3 4 3
4 5 2

輸出樣例:

10

01揹包問題演進:

 1 #include <iostream>
 2
#include <algorithm> 3 #include <vector> 4 5 using namespace std; 6 constexpr int N = 110; 7 int main() { 8 int n = 0; 9 int v = 0; 10 std::cin >> n >> v; // 輸入物品數量和揹包容量 11 vector<int> dp(N, 0); 12 for (int i = 1; i <= n; i++) { 13 int volume = 0
; 14 int weight = 0; 15 int count = 0; 16 std::cin >> volume >> weight >> count; // 輸入每件物品的體積、價值、最大可選擇數量 17 for (int j = v; j >= volume; j--) { // 類似01揹包 18 for (int k = 1; k <= count && k * volume <= j; k++) { // 遍歷同一件物品選擇次數 19 dp[j] = max(dp[j], dp[j - k * volume] + k * weight);
20 } 21 } 22 } 23 std::cout << dp[v] << endl; 24 return 0; 25 }