DVD

<问题分析>

状态转移方程 L[i]=L[i-w[j]]+v[j] if(L[i]<L[i-w[j]]+v[j])

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 #define N 100+1
 5 int main()
 6 {
 7     int i,j,k,n,m,l,w[N],v[N],L[2001],L1[2001];
 8     scanf("%d %d %d",&n,&m,&l);
 9     for(i=1;i<=n;i++)
10      scanf("%d %d",&w[i],&v[i]);
11     memset(L,0,sizeof(int)*2001);
12     memset(L1,0,sizeof(int)*2001);
13     for(i=1;i<=n;i++)
14     {
15        for(j=l;j>=w[i];j--)
16        {
17            if(L[j]<L[j-w[i]]+v[i])
18            {
19               if(L1[j]+1>m)
20                 continue;
21               L[j]=L[j-w[i]]+v[i];
22               L1[j]++;
23            }
24        }
25     }
26     j=0;
27     for(i=0;i<=l;i++)
28     {
29        if(L1[i]==m&&L[i]>j)
30          j=L[i];
31     }
32     printf("%d\n",j);
33     while(true);
34     return 0;
35 }

 

posted @ 2013-07-04 15:25  simplesslife  阅读(146)  评论(0编辑  收藏  举报