1 #include <stdio.h> 2 #include <string.h> 3 4 struct thing 5 { 6 int w[3],v[3]; 7 int size; 8 }; 9 10 int main() 11 { 12 struct thing t[61]; 13 int i,tag,tag2,j,k,n,m,v,w,p; 14 int s[2][32001]; 15 memset(s[0],0,sizeof(int)*32001); 16 scanf("%d %d",&n,&m); 17 tag=1; 18 for(i=1;i<=m;i++) 19 { 20 scanf("%d %d %d",&w,&v,&p); 21 if(p==0) 22 { 23 t[tag].size=1; 24 t[tag].w[0]=w;t[tag].w[1]=0;t[tag].w[2]=0; 25 t[tag].v[0]=v;t[tag].v[1]=0;t[tag].v[2]=0; 26 tag++; 27 } 28 else 29 { 30 t[p].size++; 31 t[p].w[t[p].size-1]=w; 32 t[p].v[t[p].size-1]=v; 33 } 34 } 35 for(i=1;i<tag;i++) 36 { 37 for(j=0;j<=n;j++) 38 { 39 tag2=0; 40 if(j-t[i].w[0]>=0&&s[(i-1)%2][j-t[i].w[0]]+t[i].w[0]*t[i].v[0]>s[(i-1)%2][j]) 41 { 42 s[i%2][j]=s[(i-1)%2][j-t[i].w[0]]+t[i].w[0]*t[i].v[0];tag2=1; 43 } 44 if(j-t[i].w[0]-t[i].w[1]>=0&&s[(i-1)%2][j-t[i].w[0]-t[i].w[1]]+t[i].w[0]*t[i].v[0]+t[i].w[1]*t[i].v[1]>s[(i-1)%2][j]) 45 { 46 s[i%2][j]=s[(i-1)%2][j-t[i].w[0]-t[i].w[1]]+t[i].w[0]*t[i].v[0]+t[i].w[1]*t[i].v[1];tag2=1; 47 } 48 if(j-t[i].w[0]-t[i].w[2]>=0&&s[(i-1)%2][j-t[i].w[0]-t[i].w[2]]+t[i].w[0]*t[i].v[0]+t[i].w[2]*t[i].v[2]>s[(i-1)%2][j]) 49 { 50 s[i%2][j]=s[(i-1)%2][j-t[i].w[0]-t[i].w[2]]+t[i].w[0]*t[i].v[0]+t[i].w[2]*t[i].v[2];tag2=1; 51 } 52 if(j-t[i].w[0]-t[i].w[1]-t[i].w[2]>=0&&s[(i-1)%2][j-t[i].w[0]-t[i].w[2]]+t[i].w[0]*t[i].v[0]+t[i].w[1]*t[i].v[1]+t[i].w[2]*t[i].v[2]>s[(i-1)%2][j]) 53 { 54 s[i%2][j]=s[(i-1)%2][j-t[i].w[0]-t[i].w[1]-t[i].w[2]]+t[i].w[0]*t[i].v[0]+t[i].w[1]*t[i].v[1]+t[i].w[2]*t[i].v[2];tag2=1; 55 } 56 if(tag2==0) 57 s[i%2][j]=s[(i-1)%2][j]; 58 } 59 } 60 printf("%d ",s[(tag-1)%2][n]); 61 while(true); 62 return 0; 63 }
<问题分析>
典型的背包问题,用一个结构体将附件与主件捆绑,状态转移方程 if(j-w[i]>=0) s[i][j]=max(s[i-1][j],s[i-1][j-w[i]]+w[i]*v[i]) else s[i][j]=s[i-1][j]