#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |