HDU 2639 第K大背包问题

来源:互联网 发布:mac 10.13 正式版 编辑:程序博客网 时间:2024/05/01 12:52

//状态方程和01背包类似,dp[j][k]表示背包容量为j的第k大背包的值。。。。。。。。。。

//应当注意的是此时dp[j][1.....k]应当是递减的。。。。。。。。。。。。。。。。。。。。


#include<stdio.h>

#include<string.h>
#define Max(x,y) (x>y?x:y)
#define max_v 1000+10
#define max_k 30+5
#define max_n 100+5

int dp[max_v][max_k],w[max_n],c[max_n];
int q1[max_k],q2[max_k];

int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,v,k;
        scanf("%d%d%d",&n,&v,&k);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){
            scanf("%d",&w[i]);
        }
        for(int i=1;i<=n;i++){
            scanf("%d",&c[i]);
        }
        for(int i=1;i<=n;i++){
            for(int j=v;j>=c[i];j--){
                for(int kk=1;kk<=k;kk++){
                    q1[kk]=dp[j-c[i]][kk]+w[i];
                    q2[kk]=dp[j][kk];
                }
                q1[k+1]=q2[k+1]=-1;
                int h=1,h1=1,h2=1;
                while(h<=k&&(h1<=k||h2<=k)){
                    if(q1[h1]>q2[h2]){
                        dp[j][h]=q1[h1];
                        h1++;
                    }
                    //else if(q1[h1]<q2[h2]){
                    else{
                        dp[j][h]=q2[h2];
                        h2++;
                    }
                        if(dp[j][h]!=dp[j][h-1]){
                        h++;
                    }
                }
            }
        }
      //      for(int i=1;i<=k;i++){
    //        printf("%d ",dp[v][i]);
    //    }
    //    puts("");
        printf("%d\n",dp[v][k]);
    }
}