洛谷P1757 通天之分組揹包 題解 分組揹包
阿新 • • 發佈:2020-09-09
題目連結:https://www.luogu.com.cn/problem/P1757
解題思路:
所謂分組揹包,就是將物品分組,每組的物品相互衝突,最多隻能選一個物品放進去。
這種題怎麼想呢?其實是從「在所有物品中選擇一件」變成了「從當前組中選擇一件」,於是就對每一組進行一次 0-1 揹包就可以了。
示例程式碼:
#include <bits/stdc++.h> using namespace std; const int maxn = 1010; struct Node { int c, v; Node() {}; Node(int _c, int _v) { c = _c; v = _v; } }; map<int, vector<Node> > groups; int n, m, f[maxn]; int main() { cin >> m >> n; for (int i = 0; i < n; i ++) { int a, b, c; cin >> a >> b >> c; groups[c].push_back(Node(a, b)); } for (map<int, vector<Node> >::iterator it = groups.begin(); it != groups.end(); it ++) { vector<Node> group = it->second; int sz = group.size(); for (int i = m; i >= 0; i --) { for (int j = 0; j < sz; j ++) { int c = group[j].c, v = group[j].v; if (i >= c) f[i] = max(f[i], f[i-c] + v); } } } cout << f[m] << endl; return 0; }