1 int vol[1010],val[1010],dp[1010][35],a[1010],b[1010];
 2 int n,v,k;
 3 void kth_01()
 4 {
 5     memset(dp,0,sizeof(dp));
 6     memset(a,0,sizeof(a));
 7     memset(b,0,sizeof(b));
 8     for(int i=1;i<=n;i++){
 9         for(int j=v;j>=vol[i];j--){
10             int kk;
11             for(kk=1;kk<=k;kk++){
12                 a[kk]=dp[j-vol[i]][kk]+val[i];
13                 b[kk]=dp[j][kk];
14             }
15             a[kk]=b[kk]=-1;//可能a或b数组先比完
16             int x=1,y=1,z=1;
17             while(z<=k&&(x<=k||y<=k)){
18                 if(a[x]>b[y]){
19                     dp[j][z]=a[x];
20                     x++;
21                 }
22                 else{
23                     dp[j][z]=b[y];
24                     y++;
25                 }
26                 if(z==1||(dp[j][z]!=dp[j][z-1])){//去重
27                     z++;
28                 }
29             }
30         }
31     }            
32 }

 

posted on 2016-02-08 00:57  Sunny糖果  阅读(217)  评论(0编辑  收藏  举报