#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <map>
#define LL long long
#define inf 0x7fffffff
#define N 1100
using namespace std; //hdu2639----求第k大01背包模板题
int cost[110], w[110], q1[40], q2[40], dp[N][40];
//dp[n][m]中n指的是容量,m指的是第几大
int main()
{
int n, v, k, t, j, i, a, b, c, T;
scanf("%d", &T);
while(T--)
{
scanf("%d%d%d", &n, &v, &k);
memset(dp, 0, sizeof(dp));
for(t=1; t<=n; ++t)
scanf("%d", w+t);
for(t=1; t<=n; ++t)
scanf("%d", cost+t);
for(i=1; i<=n; ++i)
{
for(j=v; j>=cost[i]; --j)
{
for(t=1; t<=k; ++t)
{
q1[t]=dp[j][t];
q2[t]=dp[j-cost[i]][t]+w[i];
}
q1[t]=q2[t]=-1; //设置截止标志
a=b=c=1;
while(c<=k&&(q1[a]!=-1||q2[b]!=-1)) //合并操作
{
if(q1[a]>q2[b])
{
dp[j][c]=q1[a];
a++;
}
else
{
dp[j][c]=q2[b];
b++;
}
if(dp[j][c]!=dp[j][c-1])
c++;
}
}
}
printf("%d\n", dp[v][k]);
}
return 0;
}
hdu2639----求第k大01背包模板题
最新推荐文章于 2022-04-03 11:21:11 发布