Problem Description
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

这题很巧妙,用的是01背包思想,普通的01背包求的是最优解,但是题目要求的是第K最大值,所以我们要多加一维状态,即dp[j][k]表示质量为j的第k大值,那么用a[],b[]记录dp[j][h]和dp[j-w[i]][h]+v[i](h从1~k)。然后通过这两个数组求出k个依次排列的最大值dp[j][k].

#include<stdio.h>
#include<string.h>
int v[106],w[105],dp[1006][50];
int main()
{
int n,m,i,j,T,a[200],b[200],h,k,t,x,y;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=n;i++){
scanf("%d",&v[i]);
}
for(i=1;i<=n;i++){
scanf("%d",&w[i]);
}
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++){
for(j=m;j>=w[i];j--){
for(h=1;h<=k;h++){
a[h]=dp[j][h];
b[h]=dp[j-w[i]][h]+v[i];
}
a[k+1]=-1;b[k+1]=-1;
h=0;x=y=1;
while(h<k && (x<=k || y<=k)){
if(a[x]>b[y]){
t=a[x++];
}
else t=b[y++];
if(h==0 ||(h>0 && dp[j][h]!=t)){
h++;dp[j][h]=t;
}
}
}
}
printf("%d\n",dp[m][k]);
}
return 0;
}

最新文章

  1. 各种开源Android 系统定制
  2. 在Sublime Text 3 中安装SublimeLinter,Node.js进行JS&amp;CSS代码校验
  3. T-SQL - 访问远程数据库并对其数据表进行操作
  4. editGrid分录表格
  5. UWP开发中的方向传感器
  6. [转]如何在 Visual Studio 中使用 Git 同步代码到 CodePlex
  7. android最快的模拟器
  8. AS【常用插件】
  9. extjs中gridpanel动态显示/隐藏列
  10. 使用php创建WebSocket服务
  11. struts2中配置文件的调用顺序
  12. HTML5的常用新特性你必须知道
  13. JS 作用域与变量提升---JS 学习笔记(三)
  14. JS 8-2 再谈原型
  15. 【Redis学习之五】Redis数据类型:列表和散列
  16. hadoop redis install (4)
  17. HTML表单页面的运用
  18. Angular组件生命周期——生命周期钩子
  19. Django Web开发指南笔记
  20. sql 语句 替换字段的一些内容

热门文章

  1. nodejs中的文件系统
  2. CSAPP:Lab0 -Docker搭建纯净Linux环境
  3. [GKCTF2020]老八小超市儿
  4. 阿里面试常问的redis数据结构,建议收藏
  5. websocket的应用---Django
  6. RPC 实战与原理 精简版
  7. 糊糊的学习笔记--Fiddle抓包
  8. DevOps运动的缘起 将DevOps想象为一种编程语言里面的一个接口,而SRE类实现了这个接口
  9. error out of table range
  10. 防sql注入之参数绑定 SQL Injection Attacks and Defense 预处理语句与存储过程