题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2639

第K优解问题

其基本思想是将每个状态都表示成有序队列,将状态转移方程中的max/min转化成有序队列的合并。
这里仍然以01背包为例讲解一下。首先看01背包求最优解的状态转移方程:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}。
如果要求第K优解,那么状态f[i][v]就应该是一个大小为K的数组f[i][v][1..K]。其中f[i][v][k]表示前i个物品、背包大小为v时,
第k优解的值。 “f[i][v]是一个大小为K的数组”这一句,熟悉C语言的同学可能比较好理解,或者也可以简单地理解为在原来的方程中加了一维。
显然f[i][v] [1..K]这K个数是由大到小排列的,所以我们把它认为是一个有序队列。然后原方程就可以解释为:f[i][v]
这个有序队列是由f[i-1][v]和f[i-1][v-c[i]]+w[i]这两个有序队列合并得到的。有序队列 f[i-1][v]即f[i-1][v][1..K],
f[i-1][v-c[i]]+w[i]则理解为在f[i-1][v-c[i]][1..K]的每个数上加上w[i]后得到的有序队列。
合并这两个有序队列并将结果的前K项储存到f[i][v][1..K]中的复杂度是O(K)。最后的答案是f[N] [V][K]。总的复杂度是O(VNK)。

01背包再清楚不过了,主要还是是有序队列合并的问题。

#include<stdio.h>
#include<string.h>
int n,v,k;
int dp[1005][50],w[1005],c[1005],A[50],B[50];
void work()
{int i,j,q,a,b,d;memset(dp,0,sizeof(dp));//所有值都初始化为不存在。for(i = 1; i <= n; i++){for(j = v; j >= c[i] ; j --){for(q = 1; q <= k; q++){A[q] = dp[j-c[i]][q]+w[i];//选取新队列A,A中元素为从大到小排列B[q] = dp[j][q];         //选取新队列B,B中元素为从大到小排列}a = d = b = 1; while(d <= k && (a < q|| b < q))//合并数组队列A和队列B{if(A[a] > B[b])dp[j][d] = A[a++];elsedp[j][d] = B[b++];if(dp[j][d] != dp[j][d-1])d++;}}}/*for(i = 1; i <= v; i++){for(j = 1; j <= k; j++ )printf("%2d ",dp[i][j]);printf("\n");}*/printf("%d\n",dp[v][k]);
}
int main()
{int t,i;scanf("%d",&t);while( t-- ){scanf("%d%d%d",&n,&v,&k);for(i = 1; i <= n; i++)scanf("%d",w+i);for(i = 1; i <= n; i++)scanf("%d",c+i);work();}return 0;
}

转载于:https://www.cnblogs.com/LUO257316/archive/2012/08/18/3220840.html

HDOJ 2639 Bone Collector II (背包)相关推荐

  1. HDU - 2639 Bone Collector II

    HDU - 2639 Bone Collector II dp之难,难于上青天. The title of this problem is familiar,isn't it?yeah,if you ...

  2. HDU 2639 Bone Collector II(01背包-第K优决策)

    Description 给出n件物品的价值和体积,问在总体积不超过v时的第k大价值 Input 第一行为用例组数T,每组用例第一行为三个整数n,v和k,第二行n个整数表示这n件物品的价值,第三行n个整 ...

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

  4. hdu 2602 Bone Collector 01背包

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

  5. 【HDU - 2639】Bone Collector II (第K大背包,dp,STLset)

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

  6. Bone Collector II

    http://acm.hdu.edu.cn/showproblem.php?pid=2639 The title of this problem is familiar,isn't it?yeah,i ...

  7. HDU Problem 2062 Bone Collector【01背包】

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

  8. HD 2602 Bone Collector (0-1背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 Problem Description Many years ago , in Teddy's ...

  9. hdu 2602 Bone Collector(01背包)模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/Ot ...

最新文章

  1. 如何在asp.net中动态生成验证码
  2. Docker初学3:Docker的常用命令
  3. SDOI2015 约数个数和(莫比乌斯反演经典、双上限整除分块)超详细笔记
  4. ajax从页面向action传递json 公司--》
  5. 学习Maven之Maven Enforcer Plugin
  6. find: paths must precede expression(转)
  7. logisim设计alu设计报告_【新】PowerBI 报告设计思想 结构布局篇
  8. CV之YOLOv3:深度学习之计算机视觉神经网络Yolov3-5clessses训练自己的数据集全程记录(第二次)
  9. php 各种进制表示,php各种进制的转换
  10. python大气校正_Sentinel-2卫星影像的大气校正方法
  11. python删除列表中的偶数_Python:从列表中删除奇数
  12. Direct3D Frustum裁剪原理
  13. sharepoint 在Visual Studio设置其他页面的加载标签
  14. 《实战》基于情感词典的文本情感分析与LDA主题分析
  15. 高通手机调试烧录—QFIL工具
  16. (学习笔记1)可见光与红外图像的特征融合(Feature Fusion)
  17. 2021ccpc广州站总结
  18. python游戏寻路_游戏服务端寻路的思路与实现
  19. 中小学计算机网络培训心得体会,计算机网络培训心得体会
  20. 手把手教你用深度学习做物体检测(二):数据标注

热门文章

  1. python log
  2. 4.2 One-Shot 学习
  3. 高中信息技术必修一第一章思维导图_高中生物必修+选修思维导图最全归纳,从此高中生物无忧!...
  4. vcsa上RVC查看vsan状态的命令
  5. Java基础学习总结(94)——Java线程再学习
  6. mysql in and in_完美解决mysql in条件语句只读取一条信息问题的2种方案
  7. 威纶触摸屏使用说明书_「西门子1200PLC教程」20.PLC变量表的使用
  8. linux 软链接_Linux软连接和硬链接
  9. python 开发工具_一个极具意义的 Python 前端开发工具
  10. mysql 优化关键字_MySQL 优化之 EXPLAIN 关键字