#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
cin >> N >> M;
vector<int> a(N), b(M);
for (int &x : a) cin >> x;
for (int &x : b) cin >> x;
int total = accumulate(b.begin(), b.end(), 0);
int need = accumulate(a.begin(), a.end(), 0);
// toplamlar uymuyorsa direkt imkansız
if (total != need) {
cout << "NO\n";
return 0;
}
// her subsetin hangi toplamları oluşturabileceğini bul
// subset_sum[mask] -> hangi toplamlar bu mask banknotlarla yapılabiliyor
vector< bitset<20005> > subset_sum(1 << M);
for (int mask = 0; mask < (1 << M); mask++) {
bitset<20005> bs;
bs[0] = 1;
for (int j = 0; j < M; j++) {
if (mask & (1 << j)) {
bs |= (bs << b[j]);
}
}
subset_sum[mask] = bs;
}
// dp[mask][i] = mask banknotları kullanılarak ilk i kişiye ödeme yapılabilir mi?
// i = 0..N
vector<vector<char>> dp(1 << M, vector<char>(N + 1, 0));
dp[0][0] = 1;
for (int mask = 0; mask < (1 << M); mask++) {
for (int i = 0; i < N; i++) if (dp[mask][i]) {
// bu noktada i kişi ödenmiş durumda
// i+1. kişinin maaşı a[i] için uygun subset arıyoruz
int remain = ((1 << M) - 1) ^ mask; // kullanılmamış banknotlar
// iterate over submasks of remain
for (int sub = remain; sub; sub = (sub - 1) & remain) {
if (subset_sum[sub][a[i]]) {
dp[mask | sub][i + 1] = 1;
}
}
}
}
if (dp[(1 << M) - 1][N]) cout << "YES\n";
else cout << "NO\n";
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... |