zoukankan      html  css  js  c++  java
  • HDU-2639-Bone Collector II

    题目链接

    http://acm.hdu.edu.cn/showproblem.php?pid=2639

    题目分析:01 背包的题,不过有一点改变,不再是求最大的价值而是求第k大的价值

    t    //表示case 个数

    n,m,k    //表n个数,背包容量为m,第k大的价值

    v1,v2...vn     // n个数每个数的价值。

    w1,w2,..wn  // n个数每个数的容量。

    递推分两种情况,加上第i个数,与不加,  分别存在两个数组中,各存k个,在两个数组中 2*k个数中取前k个前k大的数

    就像学校想知道一个年级的前十名 ,只要知道每个班的前十 而过程则是只要比较每2个班的前十、就可以知道全校前十。

    代码

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;

    struct node
    {
    int v,w;
    }stone[1005];

    int main(void)
    {
    int i,j,d;
    int t,n,m,k;
    int dp[1005][35],a[35],b[35];
    scanf("%d",&t);
    while(t--)
    {
    memset(dp,0,sizeof(dp));
    scanf("%d%d%d",&n,&m,&k);
    for(i=0;i<n;i++)
    scanf("%d",&stone[i].v);
    for(i=0;i<n;i++)
    scanf("%d",&stone[i].w);
    for(i=0;i<n;i++)
    {
    for(j=m;j>=stone[i].w;j--)
    {
    for(d=1;d<=k;d++)
    {
    a[d]=dp[j-stone[i].w][d]+stone[i].v;
    b[d]=dp[j][d];
    }
    a[d]=-1; b[d]=-1;
    int x=1,y=1,z=1;
    while(z<=k&&(x<=k||y<=k))
    {
    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 ",dp[m][k]);
    }
    return 0;
    }


    参数
    62MS 432K 1332 B

  • 相关阅读:
    复制表结构及数据
    mysql 字段名是关键字 报错
    mysql 截取字符串
    《官方资料》 例如:string 函数 、分组函数
    mysql event 入门
    Spring国际化
    Python学习记录
    精选股文
    为VS定制一个自己的代码生成器
    房产常识
  • 原文地址:https://www.cnblogs.com/liudehao/p/4103643.html
Copyright © 2011-2022 走看看