Submission #1273236

#TimeUsernameProblemLanguageResultExecution timeMemory
1273236arkanefuryBank (IZhO14_bank)C++20
100 / 100
382 ms47080 KiB
#include <bits/stdc++.h>
using namespace std;

int N, M;
vector<int> a, b;
vector<vector<int>> candidates;
unordered_map<int, bool> memo;

bool dfs(int i, int used) {
    if (i == (int)a.size()) return true;
    long long key = ((long long)i << 20) | used; 
    if (memo.count(key)) return memo[key];

    for (int mask : candidates[i]) {
        if ((used & mask) == 0) {
            if (dfs(i + 1, used | mask))
                return memo[key] = true;
        }
    }
    return memo[key] = false;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> N >> M;
    a.resize(N);
    b.resize(M);

    for (int i = 0; i < N; i++) cin >> a[i];
    for (int j = 0; j < M; j++) cin >> b[j];

    sort(a.rbegin(), a.rend()); 

    vector<int> subsetSum(1 << M, 0);
    for (int mask = 1; mask < (1 << M); mask++) {
        int j = __builtin_ctz(mask);
        subsetSum[mask] = subsetSum[mask ^ (1 << j)] + b[j];
    }
    candidates.resize(N);
    for (int i = 0; i < N; i++) {
        for (int mask = 1; mask < (1 << M); mask++) {
            if (subsetSum[mask] == a[i]) {
                candidates[i].push_back(mask);
            }
        }
        if (candidates[i].empty()) {
            cout << "NO\n";
            return 0;
        }
    }

    cout << (dfs(0, 0) ? "YES\n" : "NO\n");
    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...