#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve() {
int n, m;
cin >> n >> m;
vector<int> a(n), b(m);
for (int &x : a) cin >> x;
for (int &x : b) cin >> x;
// все подмножества b
vector<vector<int>> by_sum(1000 * 20 + 5); // макс сумма = 20000
for (int mask = 1; mask < (1 << m); mask++) {
int sum = 0;
for (int j = 0; j < m; j++)
if (mask & (1 << j)) sum += b[j];
if (sum < (int)by_sum.size())
by_sum[sum].push_back(mask);
}
// dp: какие маски b уже использованы
vector<char> dp(1 << m, 0), nxt(1 << m, 0);
dp[0] = 1; // изначально пустое множество
for (int need : a) {
fill(nxt.begin(), nxt.end(), 0);
for (int used = 0; used < (1 << m); used++) {
if (!dp[used]) continue;
for (int mask : by_sum[need]) {
if ((used & mask) == 0) {
nxt[used | mask] = 1;
}
}
}
dp.swap(nxt);
}
bool ok = false;
for (int x : dp) if (x) { ok = true; break; }
cout << (ok ? "YES\n" : "NO\n");
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
}
# | 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... |