제출 #859529

#제출 시각아이디문제언어결과실행 시간메모리
859529overwatch9은행 (IZhO14_bank)C++17
0 / 100
1075 ms16732 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 20;
const int maxm = 14;
const int maxmask = (1 << 14) + 1;
const int maxa = 1000 + 1;
bool possible[maxa][maxmask];
vector <int> works[maxn];
vector <int> notes;
int n, m;
void solve(int sum, int mask, int id) {
    for (int i = 0; i < maxa; i++)
        fill(possible[i], possible[i] + maxmask, 0);
    for (int i = 0; i < m; i++) {
        if (!(mask & (1 << i)))
            continue;
        possible[sum][mask] |= possible[sum - notes[i]][mask ^ (1 << i)];
    }
    if (possible[sum][mask])
        works[id].push_back(mask);
}
bool dp[maxn][maxmask];
bool ready[maxn][maxmask];
bool solve2(int i, int mask) {
    if (i == n)
        return true;
    if (ready[i][mask])
        return dp[i][mask];
    bool ans = false;
    for (auto j : works[i]) {
        if ((mask & j) == j)
            ans |= solve2(i+1, mask ^ j);
    }
    ready[i][mask] = true;
    dp[i][mask] = ans;
    return ans;
}
int main() {
    cin >> n >> m;
    vector <int> sums(n);
    notes.resize(m);
    for (int i = 0; i < n; i++)
        cin >> sums[i];
    for (int i = 0; i < m; i++) {
        cin >> notes[i];
        possible[notes[i]][(1 << i)] = true;
    }
    possible[0][0] = true;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < (1 << m); j++)
            solve(sums[i], j, i);
    }
    if (solve2(0, (1 << m) - 1))
        cout << "YES\n";
    else
        cout << "NO\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...