题目传送门
解题思路:
分组背包,代码有注释.
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<set> 4 5 using namespace std; 6 7 int n,m,c[1001],w[1001],f[1001],z[1001],p[1001],s[1001][1001]; 8 9 int main() { 10 scanf("%d%d",&m,&n); 11 for(int i = 1;i <= n; i++) { 12 scanf("%d%d%d",&c[i],&w[i],&z[i]); 13 p[z[i]]++; 14 s[z[i]][p[z[i]]] = i; 15 } 16 f[0] = 0; 17 for(int o = 1;o <= n; o++)//组数 18 for(int j = m;j >= 1; j--)//背包容量 19 for(int i = p[o];i >= 1; i--) //当前组所有物品 20 if(j >= c[s[o][i]]) 21 f[j] = max(f[j],f[j-c[s[o][i]]] + w[s[o][i]]); 22 printf("%d",f[m]); 23 return 0; 24 }