//https://vjudge.net/problem/HDU-2639#author=634579757
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll INF = 0x3f3f3f3f3f3f3f3f;
int n, m, k;
int v[105], w[105];
int f[1005][35], g[1005][35], t1[35], t2[35];
void solve()
{
cin >> n >> m >> k;
for(int i = 1; i <= n; i++) cin >> w[i];
for(int i = 1; i <= n; i++) cin >> v[i];
memset(f, 0, sizeof f);
for(int i = 1; i <= n; i++)
{
memcpy(g, f, sizeof f);
for(int j = v[i]; j <= m; j++)
{
for(int p = 1; p <= k; p++)
{
t1[p] = f[j][p];
t2[p] = f[j - v[i]][p] + w[i];
}
int p1 = 1, p2 = 1;
for(int p = 1; p <= k; p++)
{
while(p1 <= k && t1[p1] == g[j][p - 1]) p1++;
while(p2 <= k && t2[p2] == g[j][p - 1]) p2++;
if(p1 > k && p2 > k) break;
if(p2 > k || p1 <= k && t1[p1] > t2[p2]) g[j][p] = t1[p1], p1++;
else g[j][p] = t2[p2], p2++;
}
}
memcpy(f, g, sizeof g);
}
cout << f[m][k] << '\n';
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t = 1;
cin >> t;
while(t--) solve();
return 0;
}
背包第 K 优解
最新推荐文章于 2024-08-04 22:43:03 发布