<问题分析>
状态转移方程 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 ",j); 33 while(true); 34 return 0; 35 }