题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2639

题目大意:

求第k大背包。

思路:

由01背包递推式dp[i][j] = max(dp[i][j], dp[i - 1][j - w[i]] + v[i]),可知,需要求第k大背包的时候状态需要存储前k大,所以设置状态dp[i][j][k]表示前k件物品中体积为j的时候取到的第k大的价值,递推的时候,dp[i][j][1-k]这个序列,需要从dp[i-1][j][1-k]和dp[i-1][j-w[i]][1-k] + v[i]这两个序列中取不重复的前k大构成,注意去重!!(自己序列之间的重复和两个序列之间的重复)

 #include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;
const int maxn = 1e3 + ;
int T, n, m, k;
int w[], v[];
int dp[maxn][];
bool cmp(int x, int y)
{
return x > y;
}
int main()
{
scanf("%d", &T);
while(T--)
{
scanf("%d%d%d", &n, &m, &k);
for(int i = ; i < n; i++)scanf("%d", &v[i]);
for(int i = ; i < n; i++)scanf("%d", &w[i]);
memset(dp, , sizeof(dp));
int a[], b[];
for(int i = ; i < n; i++)
{
for(int j = m; j >= w[i]; j--)
{
//dp[i][j][1-k]序列由dp[i-1][j][1-k]和dp[i-1][j-w[i]][1-k]+v[i]两个序列构成
for(int c = ; c <= k; c++)
a[c] = dp[j][c], b[c] = dp[j - w[i]][c] + v[i];
int tot = , left = , right = ;
//for(int i = 1; i <= k; i++)cout<<a[i]<<" ";
//for(int i = 1; i <= k; i++)cout<<b[i]<<" ";
while(left <= k && right <= k && tot <= k)
{
if(a[left] > b[right])
{
dp[j][tot] = a[left];
while(dp[j][tot] == a[left])left++;//去重,去掉a数组后面重复的元素
tot++;
}
else if(a[left] < b[right])
{
dp[j][tot] = b[right];
while(dp[j][tot] == b[right])right++;//去重,去掉b数组后面重复的元素
tot++;
}
else
{
dp[j][tot] = a[left];
while(dp[j][tot] == a[left])left++;//去重,去掉a和b数组后面重复的元素
while(dp[j][tot] == b[right])right++;
tot++;
}
}
//此处ab数组可能只走完一个,还需要继续往后遍历
while(left <= k && tot <= k)dp[j][tot++] = a[left++];
while(right <= k && tot <= k)dp[j][tot++] = b[right++];
/*for(int i = 1; i <= k; i++)
cout<<dp[j][i]<<" ";
cout<<endl;*/
}
}
printf("%d\n", dp[m][k]);
}
return ;
}

hdu-2639 Bone Collector II---第k大背包的更多相关文章

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

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

  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

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

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

  5. hdu 2639 Bone Collector II (01背包,求第k优解)

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

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

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

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

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

  8. HDU 2639 Bone Collector II (dp)

    题目链接 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took part in ...

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

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

  10. HDU - 2639 Bone Collector II 题解

    题目大意 一个人收藏骨头,有 n 个骨头,每个骨头有体积和价值,问能够装在容量为 V 的背包中,能获得的第 k 大(去重后)价值是多少. 样例 样例输入 1 5 10 2 1 2 3 4 5 5 4 ...

随机推荐

  1. 使用angular-ui-router替代ng-router

    angular框架自身提供的ng-route在一定程度上满足了我们的需求,但是他只针对于单视图,比如点击一个link跳转到另一个视图,但是在实际业务中,需要一个状态对应的视图中还包含其他的视图,或者一 ...

  2. 笔记:Spring Cloud Eureka 服务治理

    Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务 ...

  3. 笔记:Maven 聚合和继承

    聚合模块 我们希望一次构建两个或更多项目,而不是到每个模块的目录下分别执行mvn命令,Maven 聚合这一特性就是为该需求服务的, 为了使用聚合,我们必须创建一个聚合模块,通过该模块与其他项目聚合,并 ...

  4. (floyd)佛洛伊德算法

    Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法.从表面上粗看,Floyd算法是一个非常简单的 ...

  5. 通过漫画轻松掌握HDFS工作原理

  6. ELK学习笔记(四)SpringBoot+Logback+Redis+ELK实例

    废话不多说,直接上干货,首先看下整体应用的大致结构.(整个过程我用到了两台虚拟机  应用和Shipper 部署在192.168.25.128 上 Redis和ELK 部署在192.168.25.129 ...

  7. linux利用ssh远程执行多台机器执行同样的命令

    这篇文章主要介绍了ssh远程执行命令方法和Shell脚本实例,本文讲解了ssh执行远程操作方法和远程执行命令shell脚本示例,需要的朋友可以参考下 ssh执行远程操作命令格式代码如下: ssh -t ...

  8. python爬虫---抓取优酷的电影

    最近在学习爬虫,用的BeautifulSoup4这个库,设想是把优酷上面的电影的名字及链接爬到,然后存到一个文本文档中.比较简单的需求,第一次写爬虫.贴上代码供参考: # coding:utf-8 i ...

  9. thinkphp5学习

    1.路由的问题 1.1 // pathinfo分隔符 'pathinfo_depr' => '-'设置-后,如果访问的是/index/index 化,路由规则就不能解析 必须改为index-in ...

  10. C语言博客作业—指针

    一.PTA实验作业 题目1: 求出数组中最大数和次最大数 1. 本题PTA提交列表 2. 设计思路 定义max表示范围数组中的最大数(初值设为a[0]),z表示找到的元素在数组中的位置: 定义指针*b ...