/*
分析:
第K背包就是0-1背包变异,把dp开成三维的,第三个
维度记录最大的K个值,就行了。
至于递推过程,和0-1是一样的,不用担心会漏掉情况
哦~,想想就出来了0.0
2012-07-10
*/
分析:
第K背包就是0-1背包变异,把dp开成三维的,第三个
维度记录最大的K个值,就行了。
至于递推过程,和0-1是一样的,不用担心会漏掉情况
哦~,想想就出来了0.0
2012-07-10
*/
#include"stdio.h"
#include"string.h"
struct A
{
int val;
int v;
}E[111];
int main()
{
int T;
int N,V,K;
int i,l,j;
int dp[1111][33];
int temp;
int A[33],B[33];
int a,b,c;
int f1,f2;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&N,&V,&K);
for(i=1;i<=N;i++) scanf("%d",&E[i].val);
for(i=1;i<=N;i++) scanf("%d",&E[i].v);
memset(dp,0,sizeof(dp));
for(i=1;i<=N;i++)
{
for(l=V;l>=E[i].v;l--)
{
temp=l-E[i].v;
for(j=1;j<=K;j++)
{
A[j]=dp[temp][j]+E[i].val;
B[j]=dp[l][j];
if(A[j]==E[i].val) break;
}
for(j++;j<=K;j++)
{
A[j]=0;
B[j]=dp[l][j];
}
a=b=c=1;
f1=f2=0;
while(c<=K)
{
if(A[a]>B[b]) {dp[l][c]=A[a];a++;}
else {dp[l][c]=B[b];b++;}
if(dp[l][c]==0) break;
if(dp[l][c]!=dp[l][c-1]) c++;
}
while(c<=K) dp[l][c++]=0;
}
}
printf("%d\n",dp[V][K]);
}
return 0;
}