题目大意

一个人收藏骨头,有 n 个骨头,每个骨头有体积和价值,问能够装在容量为 V 的背包中,能获得的第 k 大(去重后)价值是多少。

样例

样例输入 1

5 10 2
1 2 3 4 5
5 4 3 2 1

样例输出 1

12

样例输入 2

5 10 12
1 2 3 4 5
5 4 3 2 1

样例输出 2

2

分析

  • 跑暴力显然不优秀,每种物品可选可不选,最多 \(2^n\) 种不同的方案,也就对应这么多价值,显然如果都存下再排序输出结果,简单了事,但是显然时间和空间都承受不住。
  • 当然在跑背包的时候,我们每次的决策都是在前面的基础上求得当前阶段每个状态的最优解。如果单纯的想最后把数组中所有的值都拿来排序,也不可行。整个转移过程并不能保证比最优解小一点的就是次大值。
  • 我们可以针对每个容量 j,同时维护 k 个值,来保存放到容量 j 的时候前 k 大价值。在此基础上我们再考虑针对第 i 件物品的转移:
    • 定义 \(f[i][j][k]\) 表示前 i 件物品放到容量为 j 背包中,获得的第 k 大价值,由于第 i 捡物品状态转移的时候只跟前 i-1 的状态有关,因此还可以简化成二维,即 \(f[j][k]\)。
    • 放与不放第 i 件物品的最大值从何而来?很显然,就是普通的转移方程的两个值取较大者:\(max\{f[j][1], f[j-vi][1]+wi\}\),即放与不放分别有一个最大值,从二者当中选取一个作为最大。
    • 继续考虑第二大的候选值有哪些?
      1. 有可能该物品性价比极其低,那显然不选它可能是最好的,这样有可能最大值和次大值都为不放该物品对应的值;
      2. 有可能该物品的性价比超高,那显然选择它可能是最好的,这样有可能最大值和次大值都为放下该物品对应的值;
      3. 因此次大值的候选值会有 4 个:\(f[j][1], f[j][2], f[j-vi][1]+wi, f[j-vi][2]+wi\);
      4. 以此类推,针对每个容量,都会有 2k 个候选值。如果 \(f[j]\) 和 \(f[j-vi]\) 都存在 k 个不同值,那么 当前的 \(f[j]\) 肯定能够从中得到 k 个不同的值。
    • 另外一个问题就是如何选取 k 个不同值:
      1. 可以 sort 一遍再去重,简单粗暴有效
      2. 节俭归并排序中的合并,因为 \(f[j][k]\) 和 \(f[j-vi][k]+wi\) 都分别是降序序列,因此搞两个数组,从中不断取数合并在一起就可以了,代码略长,但是效率高不少

代码(归并的方法)

// 归并排序法合并两部分,取前kth个数
void bag() {
for (int i = 1; i <= n; ++i) {
for (int j = vol; j >= cost[i]; --j) {
int a[K] = {}, b[K] = {};
for (int k = 1; k <= kth; ++k) {
a[k] = dp[j][k];
b[k] = dp[j-cost[i]][k]+val[i];
}
a[kth+1] = -1;
b[kth+1] = -1; // 合并
int k = 1, x = 1, y = 1;
while (k <= kth && (x <= kth || y <= kth)) {
dp[j][k] = a[x] > b[y] ? a[x++] : b[y++];
if (dp[j][k] != dp[j][k-1]) {
k++;
}
}
}
}
printf("%d\n", dp[vol][kth]);
}

HDU - 2639 Bone Collector II 题解的更多相关文章

  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

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

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

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

  4. 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 ...

  5. 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 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 苏浪浪 201771010120 《面向对象程序设计(java)》第七章学习总结

    第七周 1.实验目的与要求 (1)进一步理解4个成员访问权限修饰符的用途: (2)掌握Object类的常用API用法: (3)掌握ArrayList类用法与常用API: (4)掌握枚举类使用方法: ( ...

  2. LightOJ1336

    题目大意: 给你一个 n ,求出 1 到 n 中有多少个数的因数和为偶数. 解题思路: 可以先求出因数和为奇数的数字的个数. 由算术基本定理我们可以得到:N=P1a1P2a2P3a3 … Pnan, ...

  3. JVM调优总结(八)-反思

    垃圾回收的悖论 所谓“成也萧何败萧何”.Java的垃圾回收确实带来了很多好处,为开发带来了便利.但是在一些高性能.高并发的情况下,垃圾回收确成为了制约Java应用的瓶颈.目前JDK的垃圾回收算法,始终 ...

  4. 配置单机Kafka

    配置单机kafka 关闭selinux,开启防火墙9092端口 1.关闭selinux vi /etc/selinux/config #SELINUX=enforcing #注释掉 #SELINUXT ...

  5. BZOJ1003 物流运输 题解

    发现\(n,m\)很小,我们可以先把任意\(2\)天的最短路都给求出来,考虑\(DP\),设\(f[i][j]\)表示\(j+1\)~ \(i\)这几天内走的是最短路线的最优方案,显然最优情况下\(j ...

  6. 关于Vue data对象赋值的问题

    遇到这么一个问题: 把data中的某个对象赋值给一个变量,修改变量,会同时把data中的对象也一同修改,所以,这个赋值应该就是引用了地址,贴个代码 <script> export defa ...

  7. 潜入FLEXBOX——CSS弹性布局

    介绍 Flexbox是CSS3中的一种新的布局模式,旨在满足现代Web的更复杂的需求.本文将详细介绍新近稳定化的Flexbox语法.浏览器支持将迅速增长,因此,当支持范围足够使Flexbox实用时,您 ...

  8. day 7 while循环

    #隐式布尔值: 0 none 空# 一.流程控制# 短路运算:偷懒原则,偷懒到哪个位置,就把当前位置的值返回# 为0# (10>3 and 10 and 0 and 10 )or( 10> ...

  9. Rocket - util - ReduceOthers

    https://mp.weixin.qq.com/s/gbR5fuDbE_nUFVxw-p4rsA   简单介绍ReduceOthers的实现.   ​​   1. 基本介绍   输入一组Bool元素 ...

  10. Rocket - diplomacy - DUEB参数模型分析

    https://mp.weixin.qq.com/s/533bJxcPRgO4W2gf_OEhEw   分析DUEB参数模型中各种参数类型的可能性.     1. 节点类型   根据参数的传播方向,可 ...