<span>HDU2639 Bone Collector II(dp求第K优解)</span>

/*
HDU  2639
求01背包的第k大解。
合并两个有序序列
*/
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=110;
int dp[1010][50];//dp[i][j]表示容量为i,第j大的值
int value[MAXN];
int weight[MAXN];
int a[50];
int b[50];
int N,V,K;
void DP()
{
    memset(dp,0,sizeof(dp));
    for(int i=0;i<N;i++)
       for(int j=V;j>=value[i];j--)
       {
           for(int k=1;k<=K;k++)
           {
               a[k]=dp[j][k];
               b[k]=dp[j-value[i]][k]+weight[i];
           }
           int x,y,z;
           x=y=z=1;
           a[K+1]=b[K+1]=-1;//这个一定要
           while(z<=K&&(x<=K||y<=K))//合并两个已经排好序的序列
           {
               if(a[x]>b[y])dp[j][z]=a[x++];
               else dp[j][z]=b[y++];
               if(dp[j][z]!=dp[j][z-1])z++;
           }
       }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&N,&V,&K);
        for(int i=0;i<N;i++)scanf("%d",&weight[i]);
        for(int i=0;i<N;i++)scanf("%d",&value[i]);
        DP();
        printf("%d\n",dp[V][K]);
    }
    return 0;
}

 

全部评论

相关推荐

10-24 13:36
门头沟学院 Java
Zzzzoooo:更新:今天下午有hr联系我去不去客户端,拒了
点赞 评论 收藏
分享
菜菜咪:1. 可以使用简历网站的模版,美观度会更好一点 2. 邮箱可以重新申请一个,或者用qq邮箱的别名,部分hr可能会不喜欢数字邮箱 3. 项目经历最好分点描述,类似的项目很多,可以参考一下别人怎么写的 4. 自我评价可加可不加,技术岗更看重技术。最后,加油,优秀士兵
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务