题目链接:https://www.luogu.org/problemnew/show/P1757#sub
题目描述
自01背包问世之后,小A对此深感兴趣。一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。
输入输出格式
输入格式:
两个数m,n,表示一共有n件物品,总重量为m
接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数
输出格式:
一个数,最大的利用价值
输入输出样例
输入样例#1:
45 3 10 10 1 10 5 1 50 400 2
输出样例#1:
10
说明
1<=m<=1000 1<=n<=1000 组数t<=100
分组背包的模板题
#include <bits/stdc++.h> using namespace std; int main() { int n, m; cin >> m >> n; int dp[1010]; int w[105][1005], val[105][1005], ord[1005]; int cur = 0; int a, b, c; int maxk = 0; for (int i = 1; i <=n; i++) { cin >> a >> b >> c; maxk = max(maxk, c); //记录下组数的最大值,方便循环的时候定义边界 ord[c]++; //第c组的第几个物品 w[c][ord[c]] = a; //第几组第几个物品的重量 val[c][ord[c]] = b; } for(int k=1;k<=maxk;k++) //第k组 for (int j = m; j >= 0; j--) //背包容量 { for (int i = 1; i <= ord[k]; i++) //该组的物品序号 { if(j>=w[k][i]) //由于j的范围是定义为>=0的,所以要记得加上这一条语句 dp[j] = max(dp[j], dp[j - w[k][i]] + val[k][i]); } } cout << dp[m] << endl; return 0; }
2018-05-16
原文地址:https://www.cnblogs.com/00isok/p/9045405.html
时间: 2024-11-15 00:34:06