#include <bits/stdc++.h>
using namespace std;
int N, M;
vector<int> a, b;
vector<vector<int>> candidates;
unordered_map<int, bool> memo;
bool dfs(int i, int used) {
if (i == (int)a.size()) return true;
long long key = ((long long)i << 20) | used;
if (memo.count(key)) return memo[key];
for (int mask : candidates[i]) {
if ((used & mask) == 0) {
if (dfs(i + 1, used | mask))
return memo[key] = true;
}
}
return memo[key] = false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> N >> M;
a.resize(N);
b.resize(M);
for (int i = 0; i < N; i++) cin >> a[i];
for (int j = 0; j < M; j++) cin >> b[j];
sort(a.rbegin(), a.rend());
vector<int> subsetSum(1 << M, 0);
for (int mask = 1; mask < (1 << M); mask++) {
int j = __builtin_ctz(mask);
subsetSum[mask] = subsetSum[mask ^ (1 << j)] + b[j];
}
candidates.resize(N);
for (int i = 0; i < N; i++) {
for (int mask = 1; mask < (1 << M); mask++) {
if (subsetSum[mask] == a[i]) {
candidates[i].push_back(mask);
}
}
if (candidates[i].empty()) {
cout << "NO\n";
return 0;
}
}
cout << (dfs(0, 0) ? "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... |