与01背包的不同之处在于其物品可能互相冲突
那么就建一个数组吧
题目描述
自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<iostream>
using namespace std;
int f[5000],c[5000],w[5000],a[5000][5000],s,t,p;
int main()
{
int n,m;cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>w[i]>>c[i]>>p;
a[p][0]++;
a[p][a[p][0]]=i;
t=max(t,p);
}
for(int i=1;i<=t;i++)
{
for(int j=n;j>=0;j--)
{
for(int k=1;k<=a[i][0];k++)
{
if(w[a[i][k]]<=j)
{
f[j]=max(f[j],f[j-w[a[i][k]]]+c[a[i][k]]);
}
}
}
}
cout<<f[n]<<endl;
return 0;
}