제출 #537919

#제출 시각아이디문제언어결과실행 시간메모리
537919nicolexxuu은행 (IZhO14_bank)C++14
100 / 100
448 ms20516 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[2005]; 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]; } if(sum <= 1000) combos[sum].push_back(mask); } possible[0][0] = true; for(int i = 0; i < N; i++) { for(int mask = 0; mask < (1 << M); mask++) { if(!possible[i][mask]) continue; for(int combo : combos[a[i]]) { if((combo & mask) == 0) possible[i+1][combo + mask] |= possible[i][mask]; } } } 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...