题目链接:

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

题目大意:

求第k大背包。

思路:

由01背包递推式dp[i][j] = max(dp[i][j], dp[i - 1][j - w[i]] + v[i]),可知,需要求第k大背包的时候状态需要存储前k大,所以设置状态dp[i][j][k]表示前k件物品中体积为j的时候取到的第k大的价值,递推的时候,dp[i][j][1-k]这个序列,需要从dp[i-1][j][1-k]和dp[i-1][j-w[i]][1-k] + v[i]这两个序列中取不重复的前k大构成,注意去重!!(自己序列之间的重复和两个序列之间的重复)

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<string.h>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<set>
  7. using namespace std;
  8. const int maxn = 1e3 + ;
  9. int T, n, m, k;
  10. int w[], v[];
  11. int dp[maxn][];
  12. bool cmp(int x, int y)
  13. {
  14. return x > y;
  15. }
  16. int main()
  17. {
  18. scanf("%d", &T);
  19. while(T--)
  20. {
  21. scanf("%d%d%d", &n, &m, &k);
  22. for(int i = ; i < n; i++)scanf("%d", &v[i]);
  23. for(int i = ; i < n; i++)scanf("%d", &w[i]);
  24. memset(dp, , sizeof(dp));
  25. int a[], b[];
  26. for(int i = ; i < n; i++)
  27. {
  28. for(int j = m; j >= w[i]; j--)
  29. {
  30. //dp[i][j][1-k]序列由dp[i-1][j][1-k]和dp[i-1][j-w[i]][1-k]+v[i]两个序列构成
  31. for(int c = ; c <= k; c++)
  32. a[c] = dp[j][c], b[c] = dp[j - w[i]][c] + v[i];
  33. int tot = , left = , right = ;
  34. //for(int i = 1; i <= k; i++)cout<<a[i]<<" ";
  35. //for(int i = 1; i <= k; i++)cout<<b[i]<<" ";
  36. while(left <= k && right <= k && tot <= k)
  37. {
  38. if(a[left] > b[right])
  39. {
  40. dp[j][tot] = a[left];
  41. while(dp[j][tot] == a[left])left++;//去重,去掉a数组后面重复的元素
  42. tot++;
  43. }
  44. else if(a[left] < b[right])
  45. {
  46. dp[j][tot] = b[right];
  47. while(dp[j][tot] == b[right])right++;//去重,去掉b数组后面重复的元素
  48. tot++;
  49. }
  50. else
  51. {
  52. dp[j][tot] = a[left];
  53. while(dp[j][tot] == a[left])left++;//去重,去掉a和b数组后面重复的元素
  54. while(dp[j][tot] == b[right])right++;
  55. tot++;
  56. }
  57. }
  58. //此处ab数组可能只走完一个,还需要继续往后遍历
  59. while(left <= k && tot <= k)dp[j][tot++] = a[left++];
  60. while(right <= k && tot <= k)dp[j][tot++] = b[right++];
  61. /*for(int i = 1; i <= k; i++)
  62. cout<<dp[j][i]<<" ";
  63. cout<<endl;*/
  64. }
  65. }
  66. printf("%d\n", dp[m][k]);
  67. }
  68. return ;
  69. }

hdu-2639 Bone Collector II---第k大背包的更多相关文章

  1. HDU 2639 Bone Collector II(01背包变形【第K大最优解】)

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  2. hdu 2639 Bone Collector II(01背包 第K大价值)

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  3. hdu 2639 Bone Collector II

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. HDU 2639 Bone Collector II【01背包 + 第K大价值】

    The title of this problem is familiar,isn't it?yeah,if you had took part in the "Rookie Cup&quo ...

  5. hdu 2639 Bone Collector II (01背包,求第k优解)

    这题和典型的01背包求最优解不同,是要求第k优解,所以,最直观的想法就是在01背包的基础上再增加一维表示第k大时的价值.具体思路见下面的参考链接,说的很详细 参考连接:http://laiba2004 ...

  6. HDU - 2639 Bone Collector II (01背包第k大解)

    分析 \(dp[i][j][k]\)为枚举到前i个物品,容量为j的第k大解.则每一次状态转移都要对所有解进行排序选取前第k大的解.用两个数组\(vz1[],vz2[]\)分别记录所有的选择情况,并选择 ...

  7. HDU 2639 Bone Collector II (01背包,第k解)

    题意: 数据是常规的01背包,但是求的不是最大容量限制下的最佳解,而是第k佳解. 思路: 有两种解法: 1)网上普遍用的O(V*K*N). 2)先用常规01背包的方法求出背包容量限制下能装的最大价值m ...

  8. HDU 2639 Bone Collector II (dp)

    题目链接 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took part in ...

  9. HDU 2639 Bone Collector II(01背包变型)

    此题就是在01背包问题的基础上求所能获得的第K大的价值. 详细做法是加一维去推当前背包容量第0到K个价值,而这些价值则是由dp[j-w[ i ] ][0到k]和dp[ j ][0到k]得到的,事实上就 ...

  10. HDU - 2639 Bone Collector II 题解

    题目大意 一个人收藏骨头,有 n 个骨头,每个骨头有体积和价值,问能够装在容量为 V 的背包中,能获得的第 k 大(去重后)价值是多少. 样例 样例输入 1 5 10 2 1 2 3 4 5 5 4 ...

随机推荐

  1. jQuery 3.0最终版发布,十大新特性眼前一亮

    jQuery 3.0在日前发布了最终的全新版本.从2014年10月,jQuery团队对这个主要大版本进行维护开始,web开发者社区便一直在期待着这一刻的到来,终于在2016年6月他们迎来了这一个最终板 ...

  2. CSS(CSS3)选择器(1)

    这篇文章主要用于存储CSS以及CSS3的选择器部分知识,以便日后查阅及记忆. 该内容分为两部分,第一部分为css选择器的一些基本知识.第二部分为CSS3新增加的选择器. 在开始之前,先简单介绍一下选择 ...

  3. Sql Server 索引以及页和区

    索引(Index),相信大家都知道就是给表中的数据添加了一个目录,使我们可以快速检索到我们想要的数据,但这个目录是什么?SqlServer又是如何管理的?要搞明白这些,我们就要先了解sqlserver ...

  4. 笔记:Spring Cloud Eureka 服务发现与消费

    服务发现与消费,其服务发现的任务是由Eureka的客户端完成,而服务的消费任务由Ribbon.JerseyClient等完成,Ribbon是一个基于HTTP和TCP的客户端负载均衡器:使用Jersey ...

  5. POJ1331 Multiply(strtol函数练习)

    题目链接:http://poj.org/problem?id=1331 主要介绍strtol函数: long int strtol(const char *nptr,char **endptr,int ...

  6. SpringBoot更改HttpMessageConverters使用FastJson出现乱码问题

    1.出现问题的现象!如下截图,使用SpringBoot 进行开发,接口返回的内容出现中文乱码? 接口内容想要返回的内容: 页面返回内容: 惊喜不?意外不? 为什么出现这个情况?不例外的话,很多同事都是 ...

  7. Kafka OffsetMonitor:监控消费者和延迟的队列

    一个小应用程序来监视kafka消费者的进度和它们的延迟的队列. KafkaOffsetMonitor是用来实时监控Kafka集群中的consumer以及在队列中的位置(偏移量). 你可以查看当前的消费 ...

  8. Axure RP简单作品

    点击按钮,同时出现1-7 点击按钮,依次出现1-7,

  9. Maven安装配置【WIN10】

    环境 WIN10 Maven 3.5.3 下载 下载地址:https://maven.apache.org/download.cgi 安装配置 选择好路径后一路 next 默认,安装完成. 环境变量设 ...

  10. Beta Scrum Day 2

    听说