分組揹包問題(動態規劃)
阿新 • • 發佈:2022-04-15
分組揹包問題
有 N 組物品和一個容量是 V 的揹包。
每組物品有若干個,同一組內的物品最多隻能選一個。
每件物品的體積是 vij,價值是 wij,其中 i 是組號,j 是組內編號。
求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。
輸出最大價值。
輸入格式
第一行有兩個整數 N,V,用空格隔開,分別表示物品組數和揹包容量。
接下來有 N 組資料:
- 每組資料第一行有一個整數 Si,表示第 i 個物品組的物品數量;
- 每組資料接下來有 Si 行,每行有兩個整數 vij,wij,用空格隔開,分別表示第 i 個物品組的第 j 個物品的體積和價值;
輸出格式
輸出一個整數,表示最大價值。
資料範圍
0<N,V≤100
0<Si≤100
0<vij,wij≤100
輸入樣例
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 }