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 }