#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
cin >> N >> M;
vector<int> salary(N);
vector<int> notes(M);
long long sum_salary = 0;
long long sum_notes = 0;
for(int i = 0; i < N; i++){
cin >> salary[i];
sum_salary += salary[i];
}
for(int i = 0; i < M; i++){
cin >> notes[i];
sum_notes += notes[i];
}
// Necessary condition
if(sum_salary != sum_notes){
cout << "NO\n";
return 0;
}
// Sort salaries descending (important pruning)
sort(salary.rbegin(), salary.rend());
int total_masks = 1 << M;
// Precompute subset sums
vector<int> subset_sum(total_masks, 0);
for(int mask = 1; mask < total_masks; mask++){
int lowest_bit = __builtin_ctz(mask);
int prev_mask = mask ^ (1 << lowest_bit);
subset_sum[mask] = subset_sum[prev_mask] + notes[lowest_bit];
}
// dp[mask] = how many people we have paid using exactly this mask
vector<int> dp(total_masks, -1);
dp[0] = 0;
for(int mask = 0; mask < total_masks; mask++){
if(dp[mask] == -1) continue;
int paid = dp[mask];
if(paid == N) continue;
int remaining = ((1 << M) - 1) ^ mask;
// iterate over all submasks of remaining
for(int sub = remaining; sub; sub = (sub - 1) & remaining){
if(subset_sum[sub] == salary[paid]){
int new_mask = mask | sub;
dp[new_mask] = max(dp[new_mask], paid + 1);
}
}
}
if(dp[(1 << M) - 1] == N){
cout << "YES\n";
}else{
cout << "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... |