1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <bits/stdc++.h> using namespace std;
const int N = 1005; int n, m, mid, S, a[N], b[N], sum[N], lst[N]; bool flg;
void dfs(int x, int p, int w) { if (x == 0) return (void)(flg = 1); while (a[p] < b[1] && p <= n) w += a[p], p++; if (p > n || w + sum[mid] > S || flg) return; int t = p; if (x != mid && b[x] == b[x + 1]) t = lst[x + 1]; for (int i = t; i <= n; i++) if (a[i] >= b[x]) { lst[x] = i; a[i] -= b[x]; dfs(x - 1, p, w); a[i] += b[x]; if (flg) return; } }
int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); scanf("%d", &m); for (int i = 1; i <= m; i++) scanf("%d", &b[i]); sort(a + 1, a + n + 1); sort(b + 1, b + m + 1); while (b[m] > a[n]) m--; int tot = 0; for (int i = 1; i <= n; i++) if (a[i] >= b[1]) a[++tot] = a[i]; n = tot; for (int i = 1; i <= m; i++) sum[i] = sum[i - 1] + b[i]; for (int i = 1; i <= n; i++) S += a[i]; int l = 1, r = m, ans = 0; while (l <= r) { mid = (l + r) >> 1; flg = 0; dfs(mid, 1, 0); if (flg) ans = mid, l = mid + 1; else r = mid - 1; } printf("%d\n", ans); return 0; }
|