HDU 2639

简介: Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 883 Accepted Submission(s): 411 Problem Description The title of this pr
Bone Collector II

Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 883 Accepted Submission(s): 411


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

先全部存起来,再排序,再开一个数组遇到不同的就存起来。

#include <string.h>
#include<stdio.h>
#include<algorithm>
using namespace std; 
int f[1005][35],temp[65];
int w[105],c[105];
int main()
{
    int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,vol,kth;
	   	scanf("%d%d%d",&n,&vol,&kth);
		int i,j,k,cns;
		for(i=0;i<n;i++) 
		scanf("%d",&w[i]); 
		for(i=0;i<n;i++)  
		scanf("%d",&c[i]); 
		memset(f,0,sizeof(f));
		for(i=0;i<n;i++)
		{
			for(j=vol;j>=c[i];j--)
			{
				 cns=0;
				for(k=0;k<kth;k++)
				{  
					temp[cns++]=f[j][k];
					temp[cns++]=f[j-c[i]][k]+w[i];
				}
				sort(temp,temp+cns);
				     int p=0;
				for(k=cns-1;k>=0;k--)
				{
					if(p>=kth)   
						break;
					if(k==cns-1 || temp[k]!=temp[k+1])   
						f[j][p++]=temp[k];  
				}
			}
		} 
	      printf("%d\n",f[vol][kth-1]);
	}
	return 0;
}


目录
相关文章
|
8月前
|
Java
hdu-2546-饭卡
hdu-2546-饭卡
32 0
畅通工程 HDU - 1232
畅通工程 HDU - 1232
85 0
|
人工智能 Java
hdu 1712 ACboy needs your help
ACboy这学期有N门课程,他计划花最多M天去学习去学习这些课程,ACboy再第i天学习第j门课程的收益是不同的,求ACboy能获得的最大收益。
146 0
|
机器学习/深度学习 Java 算法
|
机器学习/深度学习
|
算法 Java 文件存储
hdu 1856 More is better
点击hdu 1856思路: 思路: 离散化+并查集 分析: 1 点数最多为10^7,但是边数最多10^5,所以我们必须采用离散化,然后利用带权并查集的思想,rank[x]表示的是以x为根节点的集合的元素个数 2 这一题主要注意的就是当...
830 0

热门文章

最新文章