洛谷 P1757 通天之分组背包 【分组背包】
题目链接:https://www.luogu.org/problemnew/show/P1757#sub
题目描述
自01背包问世之后,小A对此深感兴趣。一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。
输入输出格式
输入格式:
两个数m,n,表示一共有n件物品,总重量为m
接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数
输出格式:
一个数,最大的利用价值
输入输出样例
说明
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
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。