hdoj 2639 Bone Collector II (01背包的第k优解)

来源:互联网 发布:录制游戏的软件 编辑:程序博客网 时间:2024/06/07 05:35

Bone Collector II(链接)



Sample Input
35 10 21 2 3 4 55 4 3 2 15 10 121 2 3 4 55 4 3 2 15 10 161 2 3 4 55 4 3 2 1
 

Sample Output
1220
    求第k优解
#include<bits/stdc++.h>using namespace std;const int maxn = 1010;int value[maxn];int weight[maxn];int dp[maxn][maxn];int main(){    int T,N,V,K;    scanf("%d",&T);    while(T--)    {        int a[maxn],b[maxn],p,x,y,z;        memset(dp,0,sizeof(dp));   //注意赋初值        scanf("%d%d%d",&N,&V,&K);        for(int i=0;i<N;i++) scanf("%d",&value[i]);        for(int i=0;i<N;i++) scanf("%d",&weight[i]);        for(int i=0;i<N;i++)        {            for(int j=V;j>=weight[i];j--)            {                for(p=1;p<=K;p++)                {                    a[p]=dp[j-weight[i]][p]+value[i];                    b[p]=dp[j][p];                }                a[p]=b[p]=-1;                x=y=z=1;                while(z<=K&&(a[x]!=-1||b[y]!=-1))                {                    if(a[x]>b[y])                    {                        dp[j][z]=a[x];                        x++;                    }                    else                    {                        dp[j][z]=b[y];                        y++;                    }                    if(dp[j][z]!=dp[j][z-1])                        z++;                }            }        }        printf("%d\n",dp[V][K]);    }    return 0;}

原创粉丝点击