题目背景
直达通天路·小A历险记第二篇
题目描述
自01背包问世之后,小A对此深感兴趣。一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。
输入输出格式
输入格式:
两个数m,n,表示一共有n件物品,总重量为m
接下来n行,每行3个数ai,bi,ci,表示物品的重量,利用价值,所属组数
输出格式:
一个数,最大的利用价值
输入输出样例
输入样例#1:
input: 45 4 10 10 1 10 5 1 5 20 2 50 400 2
输出样例#1:
output:30
说明
1<=m<=1000 1<=n<=1000 组数t<=100
代码
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int V,n,v[9999],c[9999],f[99999],p,a[1000][1000]; int main() { scanf("%d%d",&V,&n); for(int i=1;i<=n;i++) { scanf("%d%d%d",&v[i],&c[i],&p); a[p][++a[p][0]]=i; } for(int i=1;i<=n;i++) for(int j=V;j>=0;j--) for(int k=1;k<=a[i][0];k++) if(j>=v[a[i][k]]) if(f[j]<f[j-v[a[i][k]]]+c[a[i][k]]) f[j]=f[j-v[a[i][k]]]+c[a[i][k]]; printf("%d",f[V]); return 0; }
注意:
只有在满足if(j>=v[a[i][k]])时,才执行下面的程序!