这题和典型的01背包求最优解不同,是要求第k优解,所以,最直观的想法就是在01背包的基础上再增加一维表示第k大时的价值。
具体思路见下面的参考链接,说的很详细

参考连接:
http://laiba2004.blog.163.com/blog/static/8835120220138611342496/
http://hi.baidu.com/chenyun00/item/1c6c44318acc8bfaa88428c7

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn=;
const int maxv=;
const int maxk=;
int n,v,k;
int dp[maxv][maxk]; //dp[j][k]表示容量为j时,第k大的值
int w[maxn]; //价值
int vv[maxn]; //容量
//一开始tmp只开了maxk个大小,导致WA。。。因为对应的每个k,有dp[j][z]和dp[j-vv[i]][z]+w[i]两个状态,所以要开2*maxk大小
//int tmp[maxk*2];
int tmp1[maxk*];
int tmp2[maxk*];
int main()
{
int t,idx,cnt;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&v,&k);
for(int i=;i<=n;i++)
scanf("%d",&w[i]); //价值
for(int i=;i<=n;i++)
scanf("%d",&vv[i]); //容量
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++){
for(int j=v;j>=vv[i];j--){
//idx=0;
for(int z=;z<=k;z++){
tmp1[z]=dp[j][z];
tmp2[z]=dp[j-vv[i]][z]+w[i];
}
/*
sort(tmp+1,tmp+idx+1);
cnt=1;
dp[j][1]=tmp[idx];
for(int q=idx-1;q>=1&&cnt<k;q--){
if(tmp[q]!=tmp[q+1])
dp[j][++cnt]=tmp[q];
}
while(cnt<k){
dp[j][++cnt]=0;
}
*/
//其实不需要按照上面用排序,可以用开两个数组tmp1和tmp2存储,这两个数组都是有序序列
//这样的话,从原本的931ms减少到125ms
tmp1[k+]=-;tmp2[k+]=-; //将tmp1和tmp2的第k+1个元素设为-1,即设成较小的值
int a=,b=;
cnt=;
while(cnt<k && (a!=k+||b!=k+)){
if(tmp1[a]>tmp2[b]){
dp[j][++cnt]=tmp1[a];
a++;
}
else{
dp[j][++cnt]=tmp2[b];
b++;
}
if(dp[j][cnt]==dp[j][cnt-])
cnt--;
} } }
printf("%d\n",dp[v][k]);
}
return ;
}

hdu 2639 Bone Collector II (01背包,求第k优解)的更多相关文章

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

    题意: 数据是常规的01背包,但是求的不是最大容量限制下的最佳解,而是第k佳解. 思路: 有两种解法: 1)网上普遍用的O(V*K*N). 2)先用常规01背包的方法求出背包容量限制下能装的最大价值m ...

  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 - 2639 Bone Collector II (01背包第k大解)

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

  5. Bone Collector II---hdu2639(01背包求第k优解)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639求01背包的第k大解.合并两个有序序列 选取物品i,或不选.最终的结果,是我们能在O(1)的时间内 ...

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

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

  7. 关于01背包求第k优解

    引用:http://szy961124.blog.163.com/blog/static/132346674201092775320970/ 求次优解.第K优解 对于求次优解.第K优解类的问题,如果相 ...

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

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

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

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

随机推荐

  1. wpf mvvm MenuItem的Command事件

    这是一个事件的辅助类,可以通过它实现MenuItem的Command事件 public class MyCommands : Freezable, ICommand, ICommandSource { ...

  2. Excle中LOOKUP经典用法

    在Excle中我们经常会遇到需要求根据某个区间的判断然后获取到对应的结果,下面是一个具体的实现例子: 例如: 现在需要实现,当输入0到25以内的任何数字时,会自动获取相应的英文字母 =IFERROR( ...

  3. Percona-Xtrabackup 2.3.3 死锁不再堵塞备份(二)

    在percona-xtrabackup2.1.9下备份: session one:root(yoon)> show tables;+----------------+| Tables_in_yo ...

  4. Redbean:入门(二) - Find

    <?php require_once 'rb.php'; $tableName = 'link'; //连接数据库 R::setup('mysql:host=localhost;dbname=h ...

  5. Golang与MySQL

    1. 在golib下载go-sql-driver/mysql go get github.com/go-sql-driver/mysql 2. 代码引入 import ( "database ...

  6. thinkphp用phpexcel读取excel,并修改列中的值,再导出excel,带往excel里写入图片

    <?php class GetpriceAction extends AdministratorAction { // 文件保存路径 protected $savepath; // 允许上传的文 ...

  7. .Net开源数据库设计工具Mr.E For Linq (EF 6.1) 教程(三)更新已发布的数据库

    项目发布到服务器后,如果在后期,数据库的结构发生变更,如何更新到服务器呢? 首先,右键点击数据库,导出结构脚本文件 把脚本文件和 Mr.E.rar拷贝到服务器,在服务器解压Mr.E,运行其中的“更新数 ...

  8. Labview实现幅度信号调制(AM)

    Labview实现幅度信号调制(AM) 时域上的表达式: 其中,m(t)是交流信号分量,均值为0,需要被调制的信号,此处选择一个正弦信号,正好满足要求. A0是一个直流分量,表示叠加的直流分量,用加法 ...

  9. 28335 sci fifo send

    #include "DSP2833x_Device.h"#include "DSP2833x_Examples.h"char buf[]={0x30,0x32, ...

  10. P1699: [Usaco2007 Jan]Balanced Lineup排队

    很明显是一道RMQ问题,倍增法,维护一下区域的最大/小值就行了. var n,i,j,q,f,t,times:longint; hmin,hmax:array[..,..] of longint; f ...