HDOJ 2639 Bone Collector II (背包)
题目地址: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 (背包)相关推荐
- HDU - 2639 Bone Collector II
HDU - 2639 Bone Collector II dp之难,难于上青天. The title of this problem is familiar,isn't it?yeah,if you ...
- HDU 2639 Bone Collector II(01背包-第K优决策)
Description 给出n件物品的价值和体积,问在总体积不超过v时的第k大价值 Input 第一行为用例组数T,每组用例第一行为三个整数n,v和k,第二行n个整数表示这n件物品的价值,第三行n个整 ...
- 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 ...
- hdu 2602 Bone Collector 01背包
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 【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 ...
- Bone Collector II
http://acm.hdu.edu.cn/showproblem.php?pid=2639 The title of this problem is familiar,isn't it?yeah,i ...
- HDU Problem 2062 Bone Collector【01背包】
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HD 2602 Bone Collector (0-1背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 Problem Description Many years ago , in Teddy's ...
- hdu 2602 Bone Collector(01背包)模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/Ot ...
最新文章
- 如何在asp.net中动态生成验证码
- Docker初学3:Docker的常用命令
- SDOI2015 约数个数和(莫比乌斯反演经典、双上限整除分块)超详细笔记
- ajax从页面向action传递json 公司--》
- 学习Maven之Maven Enforcer Plugin
- find: paths must precede expression(转)
- logisim设计alu设计报告_【新】PowerBI 报告设计思想 结构布局篇
- CV之YOLOv3:深度学习之计算机视觉神经网络Yolov3-5clessses训练自己的数据集全程记录(第二次)
- php 各种进制表示,php各种进制的转换
- python大气校正_Sentinel-2卫星影像的大气校正方法
- python删除列表中的偶数_Python:从列表中删除奇数
- Direct3D Frustum裁剪原理
- sharepoint 在Visual Studio设置其他页面的加载标签
- 《实战》基于情感词典的文本情感分析与LDA主题分析
- 高通手机调试烧录—QFIL工具
- (学习笔记1)可见光与红外图像的特征融合(Feature Fusion)
- 2021ccpc广州站总结
- python游戏寻路_游戏服务端寻路的思路与实现
- 中小学计算机网络培训心得体会,计算机网络培训心得体会
- 手把手教你用深度学习做物体检测(二):数据标注
热门文章
- python log
- 4.2 One-Shot 学习
- 高中信息技术必修一第一章思维导图_高中生物必修+选修思维导图最全归纳,从此高中生物无忧!...
- vcsa上RVC查看vsan状态的命令
- Java基础学习总结(94)——Java线程再学习
- mysql in and in_完美解决mysql in条件语句只读取一条信息问题的2种方案
- 威纶触摸屏使用说明书_「西门子1200PLC教程」20.PLC变量表的使用
- linux 软链接_Linux软连接和硬链接
- python 开发工具_一个极具意义的 Python 前端开发工具
- mysql 优化关键字_MySQL 优化之 EXPLAIN 关键字