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; }

浙公网安备 33010602011771号