#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
if (!(cin >> N >> M)) return 0;
vector<int> a(N), b(M);
long long sumA = 0, sumB = 0;
for (int i = 0; i < N; ++i) { cin >> a[i]; sumA += a[i]; }
for (int j = 0; j < M; ++j) { cin >> b[j]; sumB += b[j]; }
// Быстрая невозможность: если сумма банкнот меньше суммы зарплат -> NO
if (sumB < sumA) {
cout << "NO\n";
return 0;
}
// Сортируем зарплаты по убыванию (улучшает ранний отсев в DP)
sort(a.rbegin(), a.rend());
int FULL = 1 << M;
// Предвычисляем суммы подмножеств банкнот
vector<int> sum(FULL, 0);
for (int mask = 1; mask < FULL; ++mask) {
int lowbit = mask & -mask;
int pos = __builtin_ctz(lowbit); // позиция добавленного бита
sum[mask] = sum[mask ^ lowbit] + b[pos];
}
// dp[mask] = максимальное число людей, которых можно полностью оплатить, используя банкноты из mask
// Изначально -1 (недостижимо), dp[0] = 0
vector<int> dp(FULL, -1);
dp[0] = 0;
for (int mask = 0; mask < FULL; ++mask) {
if (dp[mask] < 0) continue;
if (dp[mask] == N) break; // уже оплатили всех
int need = a[dp[mask]]; // платим (dp[mask])-ому человеку -> требуется сумма need
int remaining = ((FULL - 1) ^ mask); // банкноты, которые ещё не использованы
// Перебираем все непустые подмножества remaining
// sub перебирается снизу вверх: sub = remaining; sub = (sub-1) & remaining; ...
for (int sub = remaining; sub; sub = (sub - 1) & remaining) {
if (sum[sub] == need) {
int nmask = mask | sub;
if (dp[nmask] < dp[mask] + 1) {
dp[nmask] = dp[mask] + 1;
}
}
}
}
// Если есть такой mask, что dp[mask] == N -> YES, иначе NO
bool ok = false;
for (int mask = 0; mask < FULL; ++mask) {
if (dp[mask] == N) { ok = true; break; }
}
cout << (ok ? "YES\n" : "NO\n");
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |