1. 程式人生 > 實用技巧 >洛谷P1757 通天之分組揹包 題解 分組揹包

洛谷P1757 通天之分組揹包 題解 分組揹包

題目連結: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;
}