01背包--hdu2639
hdu-2639
The title of this problem is familiar,isn't it?yeah,if you had took part in the "Rookie Cup" competition,you must have seem this title.If you haven't seen it before,it doesn't matter,I will give you a link:
Here is the link:http://acm.hdu.edu.cn/showproblem.php?pid=2602
Today we are not desiring the maximum value of bones,but the K-th maximum value of the bones.NOTICE that,we considerate two ways that get the same value of bones are the same.That means,it will be a strictly decreasing sequence from the 1st maximum , 2nd maximum .. to the K-th maximum.
If the total number of different values is less than K,just ouput 0.
Input
The first line contain a integer T , the number of cases.
Followed by T cases , each case three lines , the first line contain two integer N , V, K(N <= 100 , V <= 1000 , K <= 30)representing the number of bones and the volume of his bag and the K we need. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.
Output
One integer per line representing the K-th maximum of the total value (this number will be less than 231).
Sample Input
3
5 10 2
1 2 3 4 5
5 4 3 2 1
5 10 12
1 2 3 4 5
5 4 3 2 1
5 10 16
1 2 3 4 5
5 4 3 2 1
Sample Output
12
2
0
题目大意
有n块骨头,V容量的背包,把骨头放进包里,求价值第k大时是多少。
思路
就是个01背包的变种,根据dp思想,在01背包的基础上加多一个维度,dp[j][k]表示容量为j的背包下,第k大的价值。
首先考虑第1大的数,是max(dp[i][j], dp[i - 1][j - c[i]] + w[i])
可以推断,第k大的值可以在两组数dp[i][j][z]、dp[i - 1][j - c[i]][z] + w[i],z∈[1, ... , k]中得到
然而并不能直接知道这两组数中前k大的数,所以将dp[i][j][z]放入A[],将dp[i - 1][j - c[i]][z] + w[i]放入B[]
然后将A[]、B[]两组数一起排序,就能得到第k大的数
代码
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
typedef long long LL;
const int N = 1005;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
int main()
{
int T;
cin >> T;
while(T--)
{
LL n, V, K;
cin >> n >> V >> K;
LL w[N], c[N];
for(int i = 1;i <= n;++i)
cin >> w[i];
for(int i = 1;i <= n;++i)
cin >> c[i];
LL dp[N][35];
memset(dp, 0, sizeof(dp));
for(int i = 1;i <= n;++i)
{
for(int j = V;j >= c[i];--j)
{
LL A[35], B[35];
int a, b, num;
for(int k = 1;k <= K;++k)
{
A[k] = dp[j - c[i]][k] + w[i];
B[k] = dp[j][k];
}
A[K + 1] = B[K + 1] = -1;//-1 < 0。a <= K做判断条件会出错
a = b = num = 1;
while(num <= K && (A[a] != -1 || B[b] != -1))
{
if(A[a] > B[b])
dp[j][num] = A[a++];
else
dp[j][num] = B[b++];
if(dp[j][num] != dp[j][num - 1])
num++;
}
}
}
cout << dp[V][K] << endl;
}
return 0;
}
01背包--hdu2639的更多相关文章
- dp之01背包hdu2639(第k优解)
http://acm.hdu.edu.cn/showproblem.php?pid=2639 题意:给出一行价值,一行体积,让你在v体积的范围内找出第k大的值.......(注意,不要 和它的第一题混 ...
- HDU2639(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背包)
题目http://acm.hdu.edu.cn/showproblem.php?pid=2639 分析:这是求第K大的01背包问题,很经典.dp[j][k]为背包里面装j容量时候的第K大的价值. 从普 ...
- NO11——01背包
# include <stdio.h> # include <stdlib.h> # include <string.h> # define max(x,y) x& ...
- 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 ...
- UVALive 4870 Roller Coaster --01背包
题意:过山车有n个区域,一个人有两个值F,D,在每个区域有两种选择: 1.睁眼: F += f[i], D += d[i] 2.闭眼: F = F , D -= K 问在D小于等于一定限度的时 ...
- POJ1112 Team Them Up![二分图染色 补图 01背包]
Team Them Up! Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7608 Accepted: 2041 S ...
- Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)
传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...
- 51nod1085(01背包)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1085 题意: 中文题诶~ 思路: 01背包模板题. 用dp[ ...
随机推荐
- JMS学习之理论基础
本文代码使用ActiveMq5.6 一.什么是JMS JMS(Java Message Service,Java消息服务)是一组Java应用程序接口(Java API),它提供创建.发送.接收.读取消 ...
- 以二进制的形式查看文件 Linux之od命令详解
od命令 以二进制的形式查看文件 od -t x1 /usr/local/FT/config/hsm_create.utf8.sql ef bb bf 4c 5f 0d 0a 5f 4e 4e 4f ...
- 【#】Spring3 MVC 注解(一)---注解基本配置及@controller和 @RequestMapping 常用解释
Spring3 MVC 注解(一)---注解基本配置及@controller和 @RequestMapping 常用解释 博客分类: spring MVCSpringWebXMLBean 一:配置 ...
- 04 Rabbits and Recurrence Relations
Problem A sequence is an ordered collection of objects (usually numbers), which are allowed to repea ...
- [GO]多任务的资源竞争问题
package main import ( "fmt" "time" ) func Printer(s string) { for _, data := ran ...
- page next page prev
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- (转)一个故事讲完https
(转)一个故事讲完https 2 1 序言 今天来聊一聊https 安全传输的原理. 在开始之前,我们来虚构两个人物, 一个是位于中国的张大胖(怎么又是你?!), 还有一个是位于米国的Bill (怎 ...
- Android开发之深入理解NFC(一)
深入理解NFC NFC(Near field communication,近场通信)也叫做近距离无线通信技术. 从原理来说,NFC和wifi类似,二者都利用无线射频技术来实现设备之间的通信. 但是,和 ...
- Alpha冲刺 - (9/10)
Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1(组长)柯奇豪 过去两天完成了哪些任务 进一步优化代码,结合自己负责的部分修 ...
- struts2下面如何同时使用servlet,就是如何实现struts与servlet共存
转载 原文链接:https://blog.csdn.net/u013358115/article/details/20706607 问题 项目要求struts2和servlet能够共存,就是strut ...