Submission #659928

#TimeUsernameProblemLanguageResultExecution timeMemory
659928a_aguiloBank (IZhO14_bank)C++14
100 / 100
572 ms123484 KiB
#include<bits/stdc++.h> using namespace std; int n, m; int getSum(int mask, int banknotes[]){ int ans = 0; for(int i = 0; i < m; ++i){ if(mask & (1 << i) ) ans+= banknotes[i]; } return ans; } int CanWePay(int person, int mask, vector<vector<int>>& DP, unordered_map<int, vector<int>>& WaysToPay, int salaries[]){ if(person == n) return true; if(mask == ((1<<n)-1)) return false; if(DP[mask][person] != -1) return DP[mask][person]; DP[mask][person] = 0; for(int payMask: WaysToPay[salaries[person]]){ if(!(mask & payMask)){ if(CanWePay(person+1, mask|payMask, DP, WaysToPay, salaries)){ DP[mask][person] = 1; break; } } } return DP[mask][person]; } int main(){ cin.tie(NULL); ios::sync_with_stdio(false); int MaxSal; cin >> n >> m; int salaries[n]; int banknotes[m]; cin >> salaries[0]; MaxSal = salaries[0]; for(int i = 1; i < n; ++i) { cin >> salaries[i]; MaxSal = max(MaxSal, salaries[i]); } for(int i = 0; i < m; ++i) cin >> banknotes[i]; unordered_map <int, vector<int>> WaysToArrive; WaysToArrive.reserve(MaxSal); for(int mask = 1; mask < (1<<m); ++mask){ int SumOfNotes = getSum(mask,banknotes); if(SumOfNotes > MaxSal) continue; if(WaysToArrive.find(SumOfNotes)== WaysToArrive.end()) WaysToArrive[SumOfNotes] = {mask}; else WaysToArrive[SumOfNotes].push_back(mask); } vector<vector<int>> DP(1<<m, vector<int>(n, -1)); if(CanWePay(0, 0, DP, WaysToArrive, salaries)) cout << "YES" << endl; else cout << "NO" << endl; 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...