Submission #1146298

#TimeUsernameProblemLanguageResultExecution timeMemory
1146298andrejikusBank (IZhO14_bank)C++17
52 / 100
1095 ms5448 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void DBG() { cerr << "]" << endl; }
template<class H, class... T> void DBG(H h, T... t) { cerr << to_string(h); if(sizeof...(t)) cerr << ", "; DBG(t...); }
#define dbg(...) cerr << "[" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__)

const int N = 21;
const int B = (1<<N);
bool dp[N][B];
int f[B];
int a[N], b[N];

bool solve() {
    int n, m; cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 0; i < m; i++) cin >> b[i];

    f[0] = 0;
    for (int mask = 1; mask < (1<<m); mask++) {
        int in = __builtin_ctz(mask);
        f[mask] = f[mask^(1<<in)] + b[in];
    }

    dp[0][0] = true;
    for (int i = 1; i <= n; i++) {
        vector<int> maske;
        for (int mask = 1; mask < (1<<m); mask++) {
            if (f[mask] == a[i])
                maske.push_back(mask);
        }
        for (int mask = 0; mask < (1<<m); mask++) {
            for (auto t : maske) {
                if ((t & mask) != 0) continue;
                if (!dp[i-1][mask]) continue;
                dp[i][mask^t] = true;
            }
        }
    }

    bool ok = false;
    for (int mask = 1; mask < (1<<m); mask++)
        ok |= dp[n][mask];
    return ok;
}

signed main() {
    ios::sync_with_stdio(false); cin.tie(0);
    int t=1; //cin >> t;
    while (t--) {
        if(solve()) cout << "YES\n";
        else cout << "NO\n";
    }
}

/*
1 5
8
4 2 5 1 3

2 6
9 10
5 4 8 6 3 11
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...