分组背包例题(如何记录组别)
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 }