#include <bits/stdc++.h>
using namespace std;
using lli = long long;
int f[21][1 << 20];
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin >> n >> m;
vector<int> a(n);
lli sum_a = 0;
for(int i = 0; i < n; ++i){
cin >> a[i];
sum_a += a[i];
}
vector<int> b(m);
lli sum_b = 0;
for(int i = 0; i < m; ++i){
cin >> b[i];
sum_b += b[i];
}
// Necessary condition
if(sum_a != sum_b){
cout << "NO\n";
return 0;
}
int total_masks = 1 << m;
// Precompute subset sums
vector<int> total(total_masks, 0);
for(int mask = 1; mask < total_masks; ++mask){
int bit = __builtin_ctz(mask);
int prev = mask ^ (1 << bit);
total[mask] = total[prev] + b[bit];
}
// For each person, store masks that match their salary
vector<vector<int>> good_mask(n);
for(int i = 0; i < n; ++i){
for(int mask = 0; mask < total_masks; ++mask){
if(total[mask] == a[i]){
good_mask[i].push_back(mask);
}
}
}
// DP
int full_mask = (1 << m) - 1;
memset(f, 0, sizeof(f));
f[0][0] = 1;
for(int i = 0; i < n; ++i){
for(int mask = 0; mask < total_masks; ++mask){
if(!f[i][mask]) continue;
for(auto x : good_mask[i]){
if((x & mask) == 0){
f[i + 1][mask | x] = 1;
}
}
}
}
// Since sums are equal, we must use ALL banknotes
cout << (f[n][full_mask] ? "YES" : "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... |