/*
显然若当前要处理的问题的时间和为t,最佳答案是t/2,
也就是两边脑所耗时间差为0。
于是现在要求的问题就是使得两边脑所耗时间差尽量小。
转化为一个费用与价值相同的背包问题。背包大小为m/2,
一个题目的费用和价值相等,都是所耗的时间。
假设背包求得的最大价值为f[m/2],显然另一个脑耗时为m-f[m / 2],
则总耗时为max(f[m/2], m-f[m/2])
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 25, M = 610;
int a[N], s[N], f[M];
int main() {
for (int i = 1; i <= 4; i ++ )
cin >> s[i];
int res = 0;
for (int k = 1; k <= 4; k ++ ) {
int m = 0;
for (int d = 1; d <= s[k]; d ++ ) {
cin >> a[d];
m += a[d];
}
memset(f, 0, sizeof f);
for (int i = 1; i <= s[k]; i ++ )
for (int j = m / 2; j >= a[i]; j -- )
f[j] = max(f[j], f[j - a[i]] + a[i]);
res += max(f[m / 2], m - f[m / 2]);
}
cout << res << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 22;
int a[N], s[N];
int ans;
void dfs(int u, int l, int r, int si) {
if (u >= si) {
ans = min(ans, max(l, r));
return;
}
dfs(u + 1, l + a[u], r, si);
dfs(u + 1, l, r + a[u], si);
}
int main() {
for (int i = 0; i < 4; i ++ ) cin >> s[i];
int res = 0;
for (int i = 0; i < 4; i ++ ) {
for (int j = 0; j < s[i]; j ++ )
cin >> a[j];
ans = 1e9;
dfs(0, 0, 0, s[i]);
res += ans;
}
cout << res << endl;
return 0;
}