Submission #537895

#TimeUsernameProblemLanguageResultExecution timeMemory
537895nicolexxuuBank (IZhO14_bank)C++14
52 / 100
1090 ms7084 KiB
#include <bits/stdc++.h> #define MAXN 21 using namespace std; int a[MAXN], b[MAXN]; bool possible[MAXN][1 << MAXN]; vector<int> combos[MAXN * 1000]; int N, M; int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cin >> N >> M; for(int i = 0; i < N; i++) cin >> a[i]; for(int i = 0; i < M; i++) cin >> b[i]; for(int mask = 0; mask < (1 << M); mask++) { int sum = 0; for(int i = 0; i < M; i++) { if(mask & (1 << i)) sum += b[i]; } combos[sum].push_back(mask); } possible[0][0] = true; for(int i = 0; i < N; i++) { for(int mask = 1; mask < (1 << M); mask++) { for(int combo : combos[a[i]]) { if((combo & mask) == combo) possible[i+1][mask] |= possible[i][mask - combo]; } } } bool res = false; for(int i = 0; i < (1 << M); i++) res |= possible[N][i]; if(res) cout << "YES\n"; else cout << "NO\n"; } //#include <iostream> //#include <vector> // //using std::cout; //using std::endl; //using std::vector; // //int main() { // int people_num; // int note_num; // std::cin >> people_num >> note_num; // vector<int> people(people_num); // vector<int> banknotes(note_num); // for (int& p : people) { // std::cin >> p; // } // for (int& b : banknotes) { // std::cin >> b; // } // // vector<int> leftover(1 << note_num, -1); // vector<int> people_covered(1 << note_num, -1); // leftover[0] = 0; // people_covered[0] = 0; // for (int s = 0; s < (1 << note_num); s++) { // for (int last = 0; last < note_num; last++) { // if ((s & (1 << last)) == 0) { // continue; // } // int prev = s & ~(1 << last); // if (people_covered[prev] == -1) { // continue; // } // // int new_amt = leftover[prev] + banknotes[last]; // // the salary of the current person we're going to try to pay // int curr_target = people[people_covered[prev]]; // // if it's still not enough, just increment the leftover pile // if (new_amt < curr_target) { // people_covered[s] = people_covered[prev]; // leftover[s] = new_amt; // } // /* // * or it's exactly right, in which case reset the leftover count // * and increment the covered amount // */ // else if (new_amt == curr_target) { // people_covered[s] = people_covered[prev] + 1; // leftover[s] = 0; // } // } // // we've covered all the people! // if (people_covered[s] == people_num) { // cout << "YES" << endl; // return 0; // } // } // cout << "NO" << endl; //}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...