1. 程式人生 > 其它 >分組揹包問題(動態規劃)

分組揹包問題(動態規劃)

分組揹包問題

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

每組物品有若干個,同一組內的物品最多隻能選一個。
每件物品的體積是 vij,價值是 wij,其中 i 是組號,j 是組內編號。

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

輸出最大價值。

輸入格式

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

接下來有 N 組資料:

  • 每組資料第一行有一個整數 Si,表示第 i 個物品組的物品數量;
  • 每組資料接下來有 Si 行,每行有兩個整數 vij,wij,用空格隔開,分別表示第 i 個物品組的第 j 個物品的體積和價值;

輸出格式

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

資料範圍

0<N,V100
0<Si100
0<vij,wij100

輸入樣例

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

輸出樣例:

8

解題思路見註釋:

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <vector>
 4 
 5 using namespace std;
 6 
 7 constexpr int N = 110;
 8 
 9 int main() {
10     int n = 0; // 物品組數
11     int v = 0; // 揹包容量
12     std::cin >> n >> v;
13 vector<int> volume(N, 0); // 儲存每組物品的體積 14 vector<int> weight(N, 0); // 儲存每組物品的價值 15 vector<int> dp(N, 0); 16 for (int i = 1; i <= n; i++) { 17 int s = 0; 18 std::cin >> s; // 輸入每組物品數量 19 for (int j = 0; j < s; j++) { 20 std::cin >> volume[j] >> weight[j]; //
輸入每組物品中每件物品體積和價值 21 } 22 for (int j = v; j >= 0; j--) { // 類似01揹包問題 23 for (int k = 0; k < s; k++) { // 遍歷同組物品選擇的個數 24 if (j >= volume[k]) { 25 dp[j] = max(dp[j], dp[j - volume[k]] + weight[k]); 26 } 27 } 28 } 29 } 30 std::cout << dp[v] << endl; 31 return 0; 32 }