HDU2639 01背包 第K优决策

hdu(2639)——Bone Collector II(01背包第K优决策) 题意: 现在给你n个数,以及最大的体积容量V,还有我们需要求的第K大的数。并且告诉你每个骨头的价值和体积。然后叫你求出第K大的总价值。(并且,这些价值中不能产生重复,也就是要去重) 阅读详情

初学背包。以下内容,来源网络,整理以作学习资料。

 

求第K优解

对于求次优解、第K优解类的问题,如果相应的最优解问题能写出状态转移方程、用动态规划解决,那么求次优解往往可以相同的复杂度解决,第K优解则比求最优解的复杂度上多一个系数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)。

 

为什么这个方法正确呢?实际上,一个正确的状态转移方程的求解过程遍历了所有可用的策略,也就覆盖了问题的所有方案。只不过由于是求最优解,所以其 它在任何一个策略上达不到最优的方案都被忽略了。如果把每个状态表示成一个大小为K的数组,并在这个数组中有序的保存该状态可取到的前K个最优值。那么, 对于任两个状态的max运算等价于两个由大到小的有序队列的合并。另外还要注意题目对于“第K优解”的定义,将策略不同但权值相同的两个方案是看作同一个解还是不同的解。如果是前者,则维护有序队列时要保证队列里的数没有重复的。

 

用个形象的比喻吧:如果我想知道学年最高分,那么,我只要知道每个班级的最高分,然后统计一遍就可以了。如果我想知道学年前十呢?我必须要知道每个班的前十名。大家在心里模拟一下,对,这就是本题核心的算法。两种决策,就可以看作这个学年只有两个班。

 

AC代码:

#include<iostream>
using namespace std;

int n,vol,k;
int dp[1005][35],value[105],cost[105],A[35],B[35];

void kth_ZeroOnePack()
{
	memset(dp,0,sizeof(dp));

	int i,j,kk,a,b,c;
	for(i=1;i<=n;++i)
	{
		for(j=vol;j>=cost[i];--j)
		{
			for(kk=1;kk<=k;++kk)
			{
				A[kk]=dp[j-cost[i]][kk]+value[i];
				B[kk]=dp[j][kk];
			}

			A[kk]=B[kk]=-1;
			a=b=c=1;
			while(c<=k && (A[a]!=-1 || B[b]!=-1))
			{
				if(A[a]>B[b])
					dp[j][c]=A[a],++a;
				else
					dp[j][c]=B[b],++b;

				if(dp[j][c]!=dp[j][c-1])
					++c;
			}
		}
	}

	cout<<dp[vol][k]<<endl;
}
		
int main()
{
	int tCase;

	cin>>tCase;
	while(tCase--)
	{
		cin>>n>>vol>>k;

		for(int i=1;i<=n;++i)
			cin>>value[i];
		for(int j=1;j<=n;++j)
			cin>>cost[j];

		kth_ZeroOnePack();
	}

	return 0;
}


 

 

 

hdu-page-11-answer.rar_hdu_hdu oj第十一页_page_搜题_杭电oj 基础算法类 ACM 入门 杭电OJ 11页题目题解,算法入门的时候刷题可以参考 搜集整理起来了比单个去搜题解方便快捷 立即下载

相关推荐

FC游戏Hack实战:从零开始修改游戏数据

本文以《忍者神龟3》为例,详细介绍了从零开始进行FC游戏Hack的完整实战流程。通过使用FCEUX模拟器和调试器,结合“递减法”精准定位生命值内存地址,并利用十六进制编辑器修改关键指令,最终实现“无限生命”效果。文章旨在引导读者理解游戏数据修改的核心原理与操作技巧,重温经典的同时深入计算机程序运行机制。

weixin_28366353的博客 359

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

Description 给出n件物品的价值和体积,问在总体积不超过v时的第k大价值 Input 第一行为用例组数T,每组用例第一行为三个整数n,v和k,第二行n个整数表示这n件物品的价值,第三行n个整数表示这n件物品的体积 Output 对于每组用例,输出总体积不超过v的最大价值 Sample Input 3 5 10 2 1 2 3 4 5 5 4 3 2 1 5 10 12

ZSQ 1040

SpringCloud 2025王炸更新!GraalVM原生镜像启动速度提升90%实战

在当今云原生和Serverless架构盛行的时代,应用的启动速度已成为衡量技术栈竞争力的关键指标。传统SpringCloud应用由于依赖JVM的动态类加载、反射等机制,启动时间通常超过30秒,在Kubernetes滚动更新和函数计算场景下成为显著性能瓶颈。2025年,SpringCloud迎来里程碑式更新,通过深度集成GraalVM原生镜像技术,实现了启动速度提升90%的惊人突破,让SpringCloud应用正式进入"秒级启动"时代。

小筱在线博客 1100

HDU 2639 (背包第K优解)

Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4317    Accepted Submission(s): 2249 Problem Description The titl

know_heng的博客 630

基于CubeMX与lwip的STM32轻量级HTTP服务器搭建及VSCode高效开发指南

本文详细介绍了如何在STM32单片机上,利用STM32CubeMX图形化配置工具和轻量级TCP/IP协议栈lwIP,快速搭建一个轻量级HTTP服务器。通过结合VSCode的高效代码编辑能力,提供了一套从硬件连接到动态网页交互(SSI/CGI)的完整开发指南,旨在为嵌入式设备提供零成本、跨平台的Web交互界面。

weixin_29163857的博客 585

halcon第二讲:焊点提取

本文要完成的任务是将下图中焊点提取出来,对应于halcon例程Blob分析中的ball.hdev。 dev_open_window (0, 0, 512, 512, 'black', WindowHandle) read_image (Image, 'die_03.png') disp_continue_message (WindowHandle, 'black', 'true') sto...

qq_24946843的博客 7175

背包的第k优解问题

nkoj 2347 Description Lynn 和banana要去爬山啦!他们一共有 K 个人(banana的人数可以看作很多),每个人都会背一个包。这些包的容量是相同的,都是 V。可以装进背包里的一共有 N 种物品,每种物品都有给定的体积和价值。在 lynn看来,合理的背包安排方案是这样的:  (1)每个人背包里装的物品的总体积恰等于包的容量。  (2)每个包里的每种物品最多只有一

INCINCIBLE的博客 895

基于MATLAB/Simulink平台进行新能源微电网运行控制的建模与仿真

新能源微电网是现代电力系统的重要组成部分,能够有效整合分布式能源(如光伏、风力发电)和储能设备,实现局部区域内的能源高效利用。微电网的运行控制涉及多源能量管理、负荷平衡以及并网/孤岛模式切换等关键问题。基于MATLAB/Simulink平台进行新能源微电网运行控制的建模与仿真,可以帮助研究者验证控制策略的有效性,并优化系统的动态性能和经济性。本项目旨在构建一个完整的新能源微电网模型,包括电源模块、储能模块、负荷模块以及控制器模块,并通过仿真分析其运行特性。

xiaoheshang_123的博客 424

背包问题(第k优解问题)

这篇博客先说一道洛谷蓝题(实际难度其实可能也就是在橙题左右,难度不大,请放心食用)

2301_80475191的博客 1129

蓝牙配对鉴权过程深度剖析:Just Works/Numeric Comparison/Passkey Entry/OOB 协议流程

当你新买的智能手表与手机配对时,是否遇到过这样的情况:有时只需在手机上点击 "确认" 即可完成配对,有时却需要在手表上输入手机显示的 6 位数字,而连接车载蓝牙时可能又需要输入固定密码?这些差异背后,是蓝牙配对鉴权机制在默默工作。蓝牙配对鉴权是设备间建立安全连接的核心环节,直接关系到数据传输的保密性和设备身份的真实性。​

byte轻骑兵的技术小窝 3577

17.6 LangSmith 私有化部署实战指南:企业级AI应用的安全基石

LangSmith 私有化部署, 企业级AI开发平台, 数据隐私合规, 混合云架构, 模型监控与审计。

yonggeit的博客 3780

HDU2639 01背包 第K优决策

求第K优解 首先给我启发是 求第k优解,只需在原来01背包的问题上加上一维,表示第k优解,其实转态转移不变,还是第i个物品选与不选,该开始始终初始化不好。。。。。出现问题。 但我发现有位大刘避免了复杂的初始化,而是在求d【i】【j】中的k时,巧妙的把原来的转态合并。这不免是个好方法,没必要刚开始就十全十美,只需我们在过程中处理一下,同样可得到我们所需的结果。 转  :http://blo

chen_lin111的专栏 526

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

hdu-2639 01背包 第K优决策

/* 比喻吧:如果想知道学年最高分,那么,只要知道每个班级的最高分, 然后统计一遍就可以了。如果想知道学年前十呢?必须要知道每个班的前十名。 心里模拟一下,这就是本题核心的算法。 两种决策,就可以看作这个学年只有两个班。 */ #include "stdio.h" #include "string.h" int n,V,kth; int v[105],p[105],dp[1005][35]; /

菜鸟成长ing 727

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

(转)HDU2639 01背包 第K优决策

求第K优解 对于求次优解、第K优解类的问题,如果相应的最优解问题能写出状态转移方程、用动态规划解决,那么求次优解往往可以相同的复杂度解决,第K优解则比求最优解的复杂度上多一个系数K。其基本思想是将每个状态都表示成有序队列,将状态转移方程中的max/min转化成有序队列的合并。这里仍然以01背包为例讲解一下。首先看01背包求最优解的状态转移方程:f[i][v]=max{f[i-1][v],f[i-...

Q755100802的博客 223

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

hdu 2639 Bone Collector II (01背包第K优决策)

Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5363    Accepted Submission(s): 2836 Problem Description The titl

albertluf的博客 281

HDU 2639 骨头收集者 II【01背包 】+【第K优决策】

题目链接:https://vjudge.net/contest/103424#problem/H 题目大意:与01背包模板题类似,只不过要我们求第K个最大的总价值。 解题分析: 其基本思想是将每个状态都表示成有序队列,将状态转移方程中的max/min转化成有序队列的合并。这里仍然以01背包为例讲解一下。首 先看01背包求最优解的状态转移方程:f[i][v]=max{f[i-1][v],f[i...

weixin_30466953的博客 325

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

Bone Collector IITime Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5701    Accepted Submission(s): 3007Problem DescriptionThe title of this proble...

baymax520的博客 250

HDU2639 01背包的第K最优决策

HDU263901背包的第K最优决策问题,一开始做天真的以为求一次01背包然后输出第K大就好了,果断WA,后来搜了一下题解才明白,要求第K大则多加一维 dp[i][v][k]表示前i个物品放入容量为v的背包中第k的最优解,而我们知道dp[i][v] = max(dp[i-1][v],dp[i-1][v-c[i]]+w[i]),相信聪明的你已经明白,dp[i][v][k]相当于由dp[i-1][v][

围巾的ACM博客 565

HDU - 2639 Bone Collector II

HDU - 2639 Bone Collector II The title of this problem is familiar,isn't it?yeah,if you had took part in the "Rookie Cup" competition,you must have seem this title.If you haven't seen it bef...

aitang6631的博客 188

0-1背包 第 K大 hdu2639

Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6277    Accepted Submission(s): 3345   Problem Description The title of th...

Unyielding will 285

01背包k-th决策模板

HDU-2639 #include<bits/stdc++.h> using namespace std; #define MAXN 1005 #define ll long long ll w[MAXN],v[MAXN]; ll dp[MAXN][MAXN]; int main(){ int pa; cin>>pa; while(pa--)...

Roar__的博客 194

第K优决策 HDU2639

看到一些比较好的东西,感觉对理解这个对于求次优解、第K优解类的问题非常有启发性吧,以前不知道应该怎么办,看了以后感觉稍微有点点想法,多想想吧,估计能触类旁通,遇到相关的一些题目可能也会有一定的想法吧,下面就是转过来的,感觉挺好的。 求第K优解 对于求次优解、第K优解类的问题,如果相应的最优解问题能写出状态转移方程、用动态规划解决,那么求次优解往往可以相同的复杂度解决,第K优解则比求最优解的复杂

封印大枪的专栏 686

HDU 2639 Bone Collector II(DP:01背包)

HDU 2639 Bone Collector II(DP:01背包) http://acm.hdu.edu.cn/showproblem.php?pid=2639 题意:同样有N个物品,每个物品有weight和value,问你在总重量不超过W的情况下,使得value值尽量大.得到的第K大的value值是多少? 分析:        首先我们令dp[i][Wx][k]=y表示决策完前i个物

code 917

01背包的第K优解

经典-&gt;  hdu2639   思路:   求第K优解 对于求次优解、第K优解类的问题,如果相应的最优解问题能写出状态转移方程、用动态规划解决,那么求次优解往往可以相同的复杂度解决,第K优解则比求最优解的复杂度上多一个系数K。其基本思想是将每个状态都表示成有序队列,将状态转移方程中的max/min转化成有序队列的合并。这里仍然以01背包为例讲解一下。首先看01背包求最优解的状态转移...

Destinymiao的博客 1096

HDU .2639.Bone Collector II 01背包

Problem Description The title of this problem is familiar,isn't it?yeah,if you had took part in the "Rookie Cup" competition,you must have seem this title.If you haven't seen it before,it does...

u013345179的博客 174
上一篇: HDU1072 nightmare
下一篇: HDU3127 完全背包 枚举所有小矩形
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值