Submission #537896

#TimeUsernameProblemLanguageResultExecution timeMemory
537896nicolexxuuBank (IZhO14_bank)C++14
100 / 100
428 ms15052 KiB
#include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> #include <unordered_set> #include <set> #include <unordered_map> #include <queue> #include <map> #define ll signed long long using namespace std; int main() { int n, m; cin >> n >> m; vector<int> a(n), b(m); for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < m; i++) { cin >> b[i]; } vector<int> dp[1001]; for (int i = 0; i < (1 << m); i++) { ll sum = 0; for (int j = 0; j < m; j++) { if (i & (1 << j)) { sum += b[j]; } } if (sum <= 1000) { dp[sum].push_back(i); } } int prev[(1 << m)]; int cur[(1 << m)]; for (int j = 0; j < (1 << m); j++) { prev[j] = cur[j] = false; } for (int i: dp[a[0]]) { prev[i]++; } for (int i = 1; i < n; i++) { for (int j = 0; j < (1 << m); j++) { if (!prev[j]) { continue; } for (int val: dp[a[i]]) { if ((val & j) == 0) { cur[val + j] += prev[j]; } } } for (int j = 0; j < (1 << m); j++) { prev[j] = cur[j]; cur[j] = false; } } bool bo = false; for (int i = 0; i < (1 << m); i++) { bo = bo || prev[i]; } if (bo) { cout << "YES"; } else { cout << "NO"; } } //#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...