Problem Description
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
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
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][N],a[N],i,j,b[N],va[N],vo[N];
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;
}