题目描述
解法:分组背包问题
#include <bits/stdc++.h>
using namespace std;
int m, n, cn;
int f[1010], a[1010], b[1010], c[101][20],cc[101];
int main()
{
scanf("%d%d", &m, &n);
for(int i=1;i<=n;i++)
{
int ci;
scanf("%d%d%d", &a[i], &b[i], &ci);
cn = max(cn, ci); // cn记录共有多少个分组
cc[ci]++; // cc[]记录第ci组中共有几件物品
c[ci][cc[ci]] = i; // c[][]记录第ci组中第j件物品
}
for(int k=1;k<=cn;k++)
for(int j=m;j>=0;j--)
for(int i=1;i<=cc[k];i++)
if(j>=a[c[k][i]])
f[j] = max(f[j], f[j-a[c[k][i]]]+ b[c[k][i]]);
printf("%d\n", f[m]);
return 0;
}