Submission #634777

#TimeUsernameProblemLanguageResultExecution timeMemory
634777tvladm2009Bank (IZhO14_bank)C++14
100 / 100
138 ms1536 KiB
#include <iostream>

using namespace std;

const int MAX_N = 20;
const int MAX_SUM = 20 * 1e3;
int a[MAX_N + 1], bank[MAX_N + 1], sp[MAX_N + 1];
bool dp[1 << MAX_N];
int spec[MAX_SUM + 1];
int n, m;

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        sp[i] = sp[i - 1] + a[i];
    }
    for (int i = 1; i <= n; i++) {
        spec[sp[i]] = i;
    }
    for (int i = 1; i <= MAX_SUM; i++) {
        if (spec[i] == 0) {
            spec[i] = spec[i - 1];
        }
    }
    for (int i = 1; i <= m; i++) {
        cin >> bank[i];
    }
    dp[0] = true;
    bool valid = false;
    for (int mask = 0; mask < (1 << m); mask++) {
        if (dp[mask]) {
            int sum = 0;
            for (int bit = 0; bit < m; bit++) {
                if (mask & (1 << bit)) {
                    sum += bank[bit + 1];
                }
            }
            for (int bit = 0; bit < m; bit++) {
                if (!(mask & (1 << bit))) {
                    int mask2 = mask;
                    mask2 |= (1 << bit);
                    int sum2 = sum + bank[bit + 1];
                    if (spec[sum] == spec[sum2]) {
                        dp[mask2] = true;
                    } else if (spec[sum] + 1 == spec[sum2] && sp[spec[sum2]] == sum2) {
                        dp[mask2] = true;
                        if (spec[sum2] == n) {
                            valid = true;
                        }
                    }
                }
            }
        }
    }
    if (valid == true) {
        cout << "YES\n";
    } else {
        cout << "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...