Submission #1326155

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