//
// All truth are easy to understand once they are discovered.
// The point is to discover them
//
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 123;
void solve(){
int n, m; cin >> n >> m;
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];
}
pair<int, int> dp[1 << m];
memset(dp, 0, sizeof(dp));
for (int mask = 0; mask < (1 << m); mask++) {
if (dp[mask].first == n) {
cout << "YES";
return;
}
for (int i = 0; i < m; i++) {
if ((mask & (1 << i))) continue;
auto [id, val] = dp[mask];
pair<int, int> nw = dp[mask];
if (val + b[i] == a[id]){
++nw.first;
nw.second = 0;
} else {
nw.second += b[i];
}
dp[mask + (1 << i)] = max(dp[mask | (1 << i)], nw);
}
}
cout << "NO";
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int tt = 1;
// cin >> tt;
while (tt--) {
solve();
cout << '\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... |