#include<cstdio>
#include<cstring>
#define MAX(x,y) ((x)>(y)?(x):(y))
int dp[1000][100];
int v[200],w[200];
int a,b,c,t1[200],t2[200];
int main()
{
int T,n,col,rank;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&col,&rank);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
memset(dp,0,sizeof(dp));
memset(t1,0,sizeof(t1));
memset(t2,0,sizeof(t2));
for(int i=1;i<=n;i++)
{
for(int j=col;j>=w[i];j--)
{
int k;
for(k=1;k<=rank;k++)
{
t1[k]=dp[j-w[i]][k]+v[i];
t2[k]=dp[j][k];
}
a=b=c=1;
while(c<=k&&(a<=rank||b<=rank))
{
if(t1[a]>t2[b])
dp[j][c]=t1[a++];
else
dp[j][c]=t2[b++];
if(dp[j][c]!=dp[j][c-1])
c++;
}
}
}
printf("%d\n",dp[col][rank]);
}
}
poj 2639 背包的第k最优解
最新推荐文章于 2019-08-30 20:18:01 发布