分组背包例题(如何记录组别)

P1757 通天之分组背包 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这道题我真的会酸Q!好笨啊,忘记了桶排序可以将组别分清楚,非得去搞结构体,麻烦还不对。注意审题,第一行输入的是总体重和个数,别输入反了。

 

唉,一定要记得桶排序啊喂!!!

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e3+100;
 4 int f[N],w[N],v[N],s[N],g[N][N];
 5 
 6 int main()
 7 {
 8     int n,m;scanf("%d%d",&m,&n);
 9     int t=0;
10     for(int i=1;i<=n;i++)
11     {
12         int xx;
13         scanf("%d%d%d",&v[i],&w[i],&xx);
14         
15         //重点 
16         t=max(t,xx);
17         s[xx]++;
18         g[xx][s[xx]]=i;
19     }
20 
21     for(int i=1;i<=t;i++)
22     {
23         for(int j=m;j>=0;j--)
24         {
25             for(int k=1;k<=s[i];k++)
26             {
27                 int vi=v[g[i][k]],wi=w[g[i][k]];
28                 if(j>=vi)
29                     f[j]=max(f[j],f[j-vi]+wi);
30             }
31         }
32     }
33     
34     printf("%d\n",f[m]);
35     
36     return 0;
37 }

 

posted @ 2022-03-26 16:32  wellerency  阅读(22)  评论(0编辑  收藏  举报