HDU 2639 Bone Collector II (01背包,第k解)
题意:
数据是常规的01背包,但是求的不是最大容量限制下的最佳解,而是第k佳解。
思路:
有两种解法:
1)网上普遍用的O(V*K*N)。
2)先用常规01背包的方法求出背包容量限制下能装的最大价值m,再以m为背包容量再进行一次01背包,dp[j]表示当物品的组合价值为j时,它们的体积之和的最小量。那么就求出了所有可能的价值,从1~m都有,但是其中一些是求不出来的,也就是骨头的价值不能组合成这个数字,那么就得过滤掉。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <limits.h>
using namespace std;
int N, V, K, dp[], w[], v[]; void cal()
{
for(int i=; i<N; i++)
{
for(int j=V; j>=v[i]; j--)
dp[j] = max( dp[j], dp[j-v[i]]+w[i] );
}
if(K==)
{
cout<<dp[V]<<endl;
return ;
} int m=dp[V];
int flag=(<<)+(<<);
dp[]=;
for(int i=; i<=m; i++)
dp[i]=flag; for(int i=; i<N; i++)
{
for(int j=m; j>=w[i]; j--)
{
if(dp[j-w[i]]<flag)
dp[j]=min(dp[j], dp[j-w[i]]+v[i]); }
} int cnt=;
for(int i=m; i>; i--)
{
if(dp[i]!=flag && dp[i]<=V )
{
cnt++;
if(cnt==K)
{
cout<<i<<endl;
return ;
}
}
}
cout<<""<<endl;
} int main()
{
//freopen("input.txt","r",stdin);
int t;
cin>>t;
while(t--)
{
memset(dp,,sizeof(dp));
cin>>N>>V>>K;
for(int i=; i<N; i++)
cin>>w[i];
for(int i=; i<N; i++)
cin>>v[i];
cal(); }
return ;
}
AC代码(第2种解法)
HDU 2639 Bone Collector II (01背包,第k解)的更多相关文章
- HDU - 2639 Bone Collector II (01背包第k大解)
分析 \(dp[i][j][k]\)为枚举到前i个物品,容量为j的第k大解.则每一次状态转移都要对所有解进行排序选取前第k大的解.用两个数组\(vz1[],vz2[]\)分别记录所有的选择情况,并选择 ...
- HDU 2639 Bone Collector II(01背包变形【第K大最优解】)
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 2639 Bone Collector II(01背包变型)
此题就是在01背包问题的基础上求所能获得的第K大的价值. 详细做法是加一维去推当前背包容量第0到K个价值,而这些价值则是由dp[j-w[ i ] ][0到k]和dp[ j ][0到k]得到的,事实上就 ...
- hdu–2369 Bone Collector II(01背包变形题)
题意:求解01背包价值的第K优解. 分析: 基本思想是将每个状态都表示成有序队列,将状态转移方程中的max/min转化成有序队列的合并. 首先看01背包求最优解的状态转移方程:\[dp\left[ j ...
- HDOJ(HDU).2602 Bone Collector (DP 01背包)
HDOJ(HDU).2602 Bone Collector (DP 01背包) 题意分析 01背包的裸题 #include <iostream> #include <cstdio&g ...
- hdu 2639 Bone Collector II(01背包 第K大价值)
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 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 ...
- hdu 2639 Bone Collector II
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU2639Bone Collector II[01背包第k优值]
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- hadoop学习路线(转)
刚刚入门hadoop,如何去学习hadoop.google一篇学习路线图,与童鞋们共勉: 转自:http://blog.csdn.net/zhoudaxia/article/details/88017 ...
- eclipse修改workspace
Eclipse是一款很强的Java IDE,我们在开始的时候,往往设定了默认的workspace,当用久在之后,我们可能要去更改一下workspace的位置,但是在启动的时候已经不会显示更改了.下面有 ...
- ubuntu 下交叉编译环境的搭建
1. 安装标准的C开发环境,由于Linux安装默认是不安装的,所以需要先安装一下(如果已经安装好的话,就可以免去这一步了): #sudo apt-get install gcc g++ libgcc1 ...
- div内textarea 居中
textarea 实现div内居中,可以使用text-align:center,因其为行内元素.
- c#之quartz任务调度的使用
这里讲下,quartz这种任务调度程序的简单使用 这是使用的quartz的3.x 版本 2.x 版本与此稍有区别,可以在网上查看2.x版本教程 使用语言为c# quartz的使用分为几个步骤 创建一个 ...
- VMWare虚拟机Windows下的下载与安装
原文链接:http://www.studyshare.cn/blog-front//software/details/1161/0一.下载此处收集各种开发工具软件,供下载官网下载:https://ww ...
- php删除文件
unlink() 函数删除文件. 若成功,则返回 true,失败则返回 false. unlink里的参数需要文件的绝对路径
- CentOS与Ubuntu修改主机名
CentOS 1.执行hostname查看主机名 2.hostname + 主机名 使需要修改的主机名立即生效,但是下次重启会失效,故需要执行第三步 3.vim /etc/sysconfig/net ...
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) D
Country of Metropolia is holding Olympiad of Metrpolises soon. It mean that all jury members of the ...
- Nginx功能介绍
Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的. 从2004年发布至今,凭借开元的力量,已经接近成熟与完善. Nginx功能丰富,可作为HTTP服务器,也可作 ...