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 ...
随机推荐
- MSSQl分布式查询(转)
MSSQlServer所谓的分布式查询(Distributed Query)是能够访问存放在同一部计算机或不同计算机上的SQL Server或不同种类的数据源, 从概念上来说分布式查询与普通查询区别 ...
- HashMap的clear方法
我们都知道HashMap的clear()方法会清楚map的映射关系,至于怎么实现的呢? 下面先看一下clear()方法的源码 public void clear() { Node<K,V> ...
- centos6.5安装sublime Text3破解版
安装后的效果图: 在csdn上找到了一个破解版. http://download.csdn.net/download/phpscott2/5356561 安装后,能够运行,但每次打开都提示没有安装py ...
- C 汉字处理
好像有个wchar_t类型的,这里不深究了,只研究char型(1个字符大小)的 1.定义 直接使用char,但每个汉字占据2个字符,所以必须以字符串形式存在 char s[10]; 2.定义时直接赋值 ...
- jquery动态创建标签
$("<div />")[0] 其中 $("<div/>") 相当于 $("<div></div>& ...
- 牛客想开了大赛2 A-【六】平面(切平面)
A-[六]平面 链接:https://ac.nowcoder.com/acm/contest/907/A?&headNav=acm来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限 ...
- pytest框架(三)
pytharm运行三种方式 代码示例: # coding=utf-8 import pytest class TestClass: def test_one(self): x = "this ...
- Python学习笔记(异常处理)
用户输入了一个不合规定的值,或者需要打开的文件不存在.这些情况被称作“异常”,一个好的程序需要能处理可能发生的异常,避免程序因此而中断. 例如我们去打开一个文件: f = file('non-exis ...
- html表格合并单元格的运用实例
效果图: 实现代码: <!DOCTYPE html><html><head><meta charset="UTF-8"><ti ...
- C# 数据库连接字符串拼接
string connectionString = string.Format(@"Data Source={0};User ID={1};Password={2};Initial Cata ...