제출 #1272666

#제출 시각아이디문제언어결과실행 시간메모리
1272666osmiyum은행 (IZhO14_bank)C++20
100 / 100
355 ms20828 KiB
#pragma GCC optimize("Ofast") #include <bits/stdc++.h> #define int long long #define endl "\n" using namespace std; int32_t main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, m; if (!(cin >> n >> m)) return 0; 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]; // sumMaskList[s] = liste halinde, toplamı s olan banknot mask'leri const int MAXSUM = 1000; vector<int> sumMaskList[MAXSUM+1]; int ALL = (int)(1LL << m); for (int mask = 0; mask < ALL; ++mask) { int sum = 0; for (int j = 0; j < m; ++j) { if (mask & (1 << j)) sum += b[j]; } if (sum <= MAXSUM) sumMaskList[sum].push_back(mask); } // dpState[mask] = kaç kişiye ödeme yapılabildiği (ilk dpState[mask] kişiye) // -1 = ulaşılamaz vector<int> dpState(ALL, -1); dpState[0] = 0; for (int mask = 0; mask < ALL; ++mask) { if (dpState[mask] == -1) continue; int paid = dpState[mask]; if (paid == n) continue; // zaten tüm kişilere ödeme yapılmış int need = a[paid]; // sıradaki kişinin ihtiyacı // Tüm alt-mask'lerden değil, önceden toplamı need olan maskleri kullan for (int s : sumMaskList[need]) { if ((mask & s) == 0) { int nmask = mask | s; if (dpState[nmask] < paid + 1) { dpState[nmask] = paid + 1; } } } } bool ok = false; for (int mask = 0; mask < ALL; ++mask) { if (dpState[mask] == n) { ok = true; break; } } cout << (ok ? "YES" : "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...