题意:

  数据是常规的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解)的更多相关文章

  1. HDU - 2639 Bone Collector II (01背包第k大解)

    分析 \(dp[i][j][k]\)为枚举到前i个物品,容量为j的第k大解.则每一次状态转移都要对所有解进行排序选取前第k大的解.用两个数组\(vz1[],vz2[]\)分别记录所有的选择情况,并选择 ...

  2. HDU 2639 Bone Collector II(01背包变形【第K大最优解】)

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

  3. HDU 2639 Bone Collector II(01背包变型)

    此题就是在01背包问题的基础上求所能获得的第K大的价值. 详细做法是加一维去推当前背包容量第0到K个价值,而这些价值则是由dp[j-w[ i ] ][0到k]和dp[ j ][0到k]得到的,事实上就 ...

  4. hdu–2369 Bone Collector II(01背包变形题)

    题意:求解01背包价值的第K优解. 分析: 基本思想是将每个状态都表示成有序队列,将状态转移方程中的max/min转化成有序队列的合并. 首先看01背包求最优解的状态转移方程:\[dp\left[ j ...

  5. HDOJ(HDU).2602 Bone Collector (DP 01背包)

    HDOJ(HDU).2602 Bone Collector (DP 01背包) 题意分析 01背包的裸题 #include <iostream> #include <cstdio&g ...

  6. hdu 2639 Bone Collector II(01背包 第K大价值)

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

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

  8. hdu 2639 Bone Collector II

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

  9. HDU2639Bone Collector II[01背包第k优值]

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

随机推荐

  1. HDOJ-2153

    仙人球的残影 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  2. Netdata 是一款 Linux 性能实时监测工具

    具体的netdata介绍请参照GIT:https://github.com/firehol/netdata/wiki 以下只介绍centos下的netdata的安装与使用: 1.安装Netdata需要 ...

  3. PJzhang:经典子域名爆破工具subdomainsbrute

    猫宁!!! 参考链接: https://www.waitalone.cn/subdomainsbrute.html https://www.secpulse.com/archives/5900.htm ...

  4. 51nod1113【矩阵快速幂】

    思路: 裸的矩阵快速幂,读完题,感觉有点对不起四级算法题这一类. #include<bits/stdc++.h> using namespace std; typedef long lon ...

  5. Android权限之三共享UID和签名

    http://blog.csdn.net/a345017062/article/details/6236263 共享UID 安装在设备中的每一个Android包文件(.apk)都会被分配到一个属于自己 ...

  6. poj 3417 Network(tarjan lca)

    poj 3417 Network(tarjan lca) 先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂. 我们设 ...

  7. jdk及tomcat的安装

    Tomcat和JDK安装指南 1  JDK的安装 要运行JAVA程序,必须安装JDK(JAVA 开发包)的支持. 1.1  安装 1.J2SDK的安装比较简单,在安装盘目录下寻找“JDK安装程序”文件 ...

  8. jsp学习与提高(四)——JSP Session 处理

    JSP Session HTTP是无状态协议,这意味着每次客户端检索网页时,都要单独打开一个服务器连接,因此服务器不会记录下先前客户端请求的任何信息. 有三种方法来维持客户端与服务器的会话: Cook ...

  9. 领域驱动设计业务框架DMVP

    DMVP,全称DDD-MVP,是基于领域驱动设计(DDD)搭建的业务框架,整体设计符合DDD领域模型的规范,业务上达成了领域模型和代码的一一映射,技术上达成了高内聚低耦合的架构设计,开发人员不需要关注 ...

  10. docker镜像删除

    1. 查看镜像 docker images [-q] 只列出image id [-a] 列出所有的image 2. 查看运行的镜像 docker ps [-q] 只列出container id [-a ...