题目链接:https://www.luogu.org/problem/P1757
最基础的分组背包,码在这里
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; int dp[1010]; int a[1010],b[1010],c[1010],d[1010],f[1010][1010]; int main(){ int m,n;cin>>m>>n; int num=0;//存的是组的数目 for(int i=1;i<=n;i++){ scanf("%d%d%d",&a[i],&b[i],&c[i]); num=max(num,c[i]); d[c[i]]++;//第c[i]组的物品个数增加 f[c[i]][d[c[i]]]=i;//第几组的第几个的序号是多少 } for(int i=1;i<=num;i++){//枚举组的数目 for(int j=m;j>=0;j--){ for(int k=1;k<=d[i];k++){//依次枚举第i组的第几个 if(j>=a[f[i][k]]) dp[j]=max(dp[j],dp[j-a[f[i][k]]]+b[f[i][k]]); } } } cout<<dp[m]<<endl; return 0; }