Submission #1326144

#TimeUsernameProblemLanguageResultExecution timeMemory
1326144pfangBank (IZhO14_bank)C++20
0 / 100
0 ms332 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...