-----------------
链接:Miku
-----------------
分组背包,我们只需要在01背包的基础上稍加修改,把同一类的物品同时枚举即可。
-----------------
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,m; struct th{ int v; int w; int l; } t[100001]; int dp[100001]; int num[100001]; bool cmp( th x,th y){ return x.l<y.l; } int vis[1001]; int cnt; int main(){ scanf("%d%d",&m,&n); for(int i=1;i<=n;++i){ cin>>t[i].v>>t[i].w>>t[i].l; if(!vis[t[i].l]){ vis[t[i].l]=1; cnt++; } num[t[i].l]++; } sort(t+1,t+n+1,cmp); int l=1; //for(int i=1;i<=n;++i){ // printf("%d %d %d\n",t[i].w,t[i].v,t[i].l); //} int summ=0; for(int i=1;i<=cnt;++i){ summ+=num[i-1]; for(int j=m;j>=0;--j){ for(int k=1;k<=num[i];++k){ if(j>=t[summ+k].v) dp[j]=max(dp[j],dp[j-t[summ+k].v]+t[summ+k].w); } } } printf("%d",dp[m]); return 0; }Ac