题目链接:

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. 请详细描述(以硬盘启动)Linux系统从打开主机电源到进入登录界面整个过程的流程。

    1. 开机进行BIOS(BIOS(Basic Input / Output System)自检测系统外围硬件设备如CPU.内存.IO.显卡.鼠标键盘等.根据BIOS中设置的系统启动顺序搜索用于启动系统 ...

  2. 利用github协作开发步骤

    项目使用IDEA开发,IDEA上可以加载很多的插件(而且下载很快),安装github插件,安装git 首先一个成员需要创建好代码库,这个代码库存放项目,所有的开发提交代码都是向这个库提交,在githu ...

  3. centos下mongodb备份(dump)与还原(restore)

    数据服务器,数据库采用mongodb数据库 安装:通过增加配置安装mongodb-org,版本为3.0.7,yum安装            yum install mongodb-org 数据备份与 ...

  4. EF Core利用Transaction对数据进行回滚保护

    What? 首先,说一下什么是EF Core中的Transaction Transaction允许以原子方式处理多个数据库操作,如果事务已提交,则所有操作都应用于数据库,如果事务回滚,则没有任何操作应 ...

  5. Restful风格,PUT修改功能请求,表单中存在文件报错-HTTP Status 405 - Request method 'POST' not supported

    解决方案配置如下 <!-- 配置文件上传解析器 --> <bean id="multipartResolver" class="org.springfr ...

  6. python爬虫解决gbk乱码问题

    今天尝试了下爬虫,爬取一本小说,忘语的凡人修仙仙界篇,当然这样不好,大家要支持正版. 爬取过程中是老套路,先获取网页源代码 # -*- coding:UTF-8 -*- from bs4 import ...

  7. Dependency Walker的替代品Dependencies

    在c++时代, Dependency Walker基本上是大部分程序员必备的工具之一,很可惜的是从2006起就不更新了.而且只支持vc的名字undemangle, https://github.com ...

  8. 初学MySQL基础知识笔记--02

    查询部分 1> 查询数据中所有数据:select * from 表名 2> 查询数据中某项的数据:eg:select id,name from students; 3> 消除重复行: ...

  9. 2018上C语言程序设计(高级)作业- 第0次作业

    准备工作(10分) 1.在博客园申请个人博客. 2.加入班级博客(2班班级博客链接地址)(1班班级博客链接地址) 3.关注邹欣老师博客.关注任课老师博客. 4.加入讨论小组,学习过程中遇到问题不要随意 ...

  10. Java暑期作业

    一.假期观影笔记--<熔炉> 影片<熔炉>是根据发生在韩国光州聋哑学校里的真实事件而改编.影片讲述的是在一所聋哑儿童学校里,校长.教务以及老师披着慈善的华丽外衣对学校中的多名未 ...