NOIP2006 第二题(change)

 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\n",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]

 

posted @ 2013-07-02 10:38  simplesslife  阅读(215)  评论(0)    收藏  举报