제출 #859529

#제출 시각아이디문제언어결과실행 시간메모리
859529overwatch9은행 (IZhO14_bank)C++17
0 / 100
1075 ms16732 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; const int maxn = 20; const int maxm = 14; const int maxmask = (1 << 14) + 1; const int maxa = 1000 + 1; bool possible[maxa][maxmask]; vector <int> works[maxn]; vector <int> notes; int n, m; void solve(int sum, int mask, int id) { for (int i = 0; i < maxa; i++) fill(possible[i], possible[i] + maxmask, 0); for (int i = 0; i < m; i++) { if (!(mask & (1 << i))) continue; possible[sum][mask] |= possible[sum - notes[i]][mask ^ (1 << i)]; } if (possible[sum][mask]) works[id].push_back(mask); } bool dp[maxn][maxmask]; bool ready[maxn][maxmask]; bool solve2(int i, int mask) { if (i == n) return true; if (ready[i][mask]) return dp[i][mask]; bool ans = false; for (auto j : works[i]) { if ((mask & j) == j) ans |= solve2(i+1, mask ^ j); } ready[i][mask] = true; dp[i][mask] = ans; return ans; } int main() { cin >> n >> m; vector <int> sums(n); notes.resize(m); for (int i = 0; i < n; i++) cin >> sums[i]; for (int i = 0; i < m; i++) { cin >> notes[i]; possible[notes[i]][(1 << i)] = true; } possible[0][0] = true; for (int i = 0; i < n; i++) { for (int j = 0; j < (1 << m); j++) solve(sums[i], j, i); } if (solve2(0, (1 << m) - 1)) cout << "YES\n"; else cout << "NO\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...