HDU 2693 Bone Collector II
2016-04-07 13:22
381 查看
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
记录前k大的最优值,即p[v][k]表示装了v体积的东西获得第k大的价值
多开两个数组a[], b[]来保存 p[j - w[i]][1 -> k] + v[i] , 以及p[j][1 - >k] 这些值
然后将两个数组里面的值按大到小的顺序重新写入 p[j][1 -k]中
#include <iostream> #include <string.h> #define N 110 #define V 1010 using namespace std; int t,n,v,k,p[V] ,a ,i,j,b ,va ,vo ; int d; int x,y,z; int main() { cin>>t; while(t--) { memset(p,0,sizeof(p)); memset(a,-1,sizeof(a)); memset(b,-1,sizeof(b)); cin>>n>>v>>k; for (i=1; i<=n; i++) cin>>va[i]; for (i=1; i<=n; i++) cin>>vo[i]; a[0]=b[0]=1; for(i=1; i<=n;i++) { for(j=v; j>=vo[i]; j--) { for (d=1; d<=k; d++) { a[d]=p[j-vo[i]][d]+va[i]; b[d]=p[j][d]; } x=y=z=1; while(z<=k&&(x<=k||y<=k)) { if(a[x]>b[y]) p[j][z]=a[x++]; else p[j][z]=b[y++]; if (p[j][z]!=p[j][z-1]) z++; } } } cout<<p[v][k]<<endl; } return 0; }
相关文章推荐
- FZU2030(括号匹配)
- Fox And Names
- 赛马问题
- MySQL(7)-多源复制
- CentOS7下二进制文件安装MySQL5.6
- UITextField的使用
- php计算字符串长度:utf8编码,包含中文
- 2016年三月份资源实力排行榜
- POJ2253 Frogger
- Swift、OC混编用到的Bridging-Header.h
- 从.NET转JAVA开发
- Android Studio 简介
- python3学习笔记1--TypeError: 'dict' object is not callable的解决
- unity3d动画帧事件回调脚本必须直接挂在模型上
- Hibernate 下载、安装和使用
- WebRequest请求范例
- win32下安装mingw32和cmake来编译opencv2.4.9
- 機器學習基石(Machine Learning Foundations) 机器学习基石 作业三 Q13-15 C++实现
- CDMA2000 3G Chat 拨号
- 实现简单的队和栈结构,附代码,图