P1757 通天之分组背包(分组背包)

两个数 m,nm,n,表示一共有 nn 件物品,总重量为 mm。

接下来 nn 行,每行 33 个数 a_i,b_i,c_iai,bi,ci,表示物品的重量,利用价值,所属组数。

输出格式

一个数,最大的利用价值。

输入输出样例

输入 #1
45 3
10 10 1
10 5 1
50 400 2
输出 #1
10
思路:每组物品相互冲突,那么就在每组中对不同价值的物品进行选择,不同的初始金钱选择可能不一样,只选择它能选择到的最大物品
然后再对每组进行背包
AC代码:
#include<bits/stdc++.h>
using namespace std;
int dp[1005][1005];
int res[1005];
int n, m;
int main() {
    //freopen("test.txt", "r", stdin);
    scanf("%d%d", &n, &m);
    int num = 0;
    for (int i = 1; i <= m; i++) {
        int a, b, c; scanf("%d%d%d", &a, &b, &c);
        for (int j = n; j >= a; j--) {
            dp[c][j] = max(dp[c][j],b);
        }
        num = max(num, c);
    }
    for (int i = 1; i <= num; i++) {
        for (int j = n; j >= 1; j--) {
            for (int k = 1; k <= j; k++) {
                res[j] = max(res[j], res[j - k] + dp[i][k]);
            }
        }
    }
    cout << res[n] << endl;
    return 0;
}

 

posted @ 2021-03-21 08:56  cono奇犽哒  阅读(91)  评论(0)    收藏  举报