标签:
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
12 2 0
求第K大的总价值
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <algorithm>
#define N 10009
using namespace std;
int w[N],c[N],dp[N][33];
int T;
int n,v,k;
int a[N],b[N];
int main()
{
while(~scanf("%d",&T))
{
while(T--)
{
scanf("%d %d %d",&n,&v,&k);
memset(dp,0,sizeof dp);
//memset(w,0,sizeof w);
// memset(c,0,sizeof c);
memset(a,0,sizeof a);
memset(b,0,sizeof b);
for(int i=0;i<n;i++)
scanf("%d",&w[i]);
for(int i=0;i<n;i++)
scanf("%d",&c[i]);
for(int i=0;i<n;i++)
for(int j=v;j>=c[i];j--)
{
for(int t=1;t<=k;t++)
{
a[t]=dp[j][t];
b[t]=dp[j-c[i]][t]+w[i];
}
int p1=1,p2=1,num=1;
while(1)
{
if(a[p1]>=b[p2])
{
dp[j][num]=a[p1];
p1++;
}
else
{
dp[j][num]=b[p2];
p2++;
}
if(dp[j][num]!=dp[j][num-1])
num++;
if(num>k || (p1>k&&p2>k))
break;
}
}
printf("%d\n",dp[v][k]);
}
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/wust_zjx/article/details/44903109