HDU2693 骨头收藏家II(第k大背包)

来源:互联网 发布:淘宝店铺装修页头没了 编辑:程序博客网 时间:2024/05/01 08:59

【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=2639

题目意思

给你n种骨头,每种骨头占用对应的空间,却有相应的价值。现在你有v的背包,问第k大的价值是多少(相同价值只算一次)

解题思路

第k大背包题,处理下值相同情况就可以了

代码部分

#include <bits/stdc++.h>using namespace std;#define LL long longconst int maxn=105;const int INF=0x3f3f3f;LL dp[35][1005],p1[35],p2[35];int w[maxn],v[maxn];int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n,m,k;        scanf("%d %d %d",&n,&m,&k);        /*for (int i=1;i<=k;i++)            for (int j=0;j<=m;j++)                if (i==1)                    dp[i][j]=0;                else dp[i][j]=-INF;*/        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",&v[i]);        for (int i=1; i<=n; i++)        {            for (int j=m; j>=v[i]; j--)            {                for (int z=1; z<=k; z++)                {                    p1[z]=dp[z][j];                    p2[z]=dp[z][j-v[i]]+w[i];                }                int h1=1,h2=1,h=1;                while(h<=k&&(h1<=k||h2<=k))                {                    if (p1[h1]>p2[h2]&&h1<=k||h2>k) ///必须判断h1和h2                    {                        if (p1[h1]!=dp[h-1][j])  ///如果不等于前个价值                            dp[h++][j]=p1[h1];                        h1++;                    }                    else                    {                        if (p2[h2]!=dp[h-1][j])                            dp[h++][j]=p2[h2];                        h2++;                    }                }            }        }        printf("%d\n",dp[k][m]);    }    return 0;}
原创粉丝点击