제출 #1308579

#제출 시각아이디문제언어결과실행 시간메모리
1308579buzdiBank (IZhO14_bank)C++17
100 / 100
268 ms16984 KiB
#include <bits/stdc++.h>
#define ll long long

using namespace std;

const int NMAX = 20;
const int VMAX = 1000;

int n, m, maxi;
int a[NMAX + 1], b[NMAX + 1];
vector<int> v[VMAX + 1];
queue<pair<int, int>> q;
bool visited[NMAX + 1][1 << NMAX];

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> m;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for(int i = 1; i <= m; i++) {
        cin >> b[i];
    }

    maxi = *max_element(a + 1, a + n + 1);
    for(int mask = 1; mask < (1 << m); mask++) {
        int sum = 0;
        for(int i = 1; i <= m; i++) {
            if(mask >> (i - 1) & 1) {
                sum += b[i];
            }
        }
        if(sum <= maxi) {
            v[sum].push_back(mask);
        }
    }

    q.push({0, (1 << m) - 1});
    visited[0][(1 << m) - 1] = 1;
    while(!q.empty()) {
        auto [i, mask] = q.front();
        q.pop();

        for(int x : v[a[i + 1]]) {
            if((mask & x) == x && !visited[i + 1][mask ^ x]) {
                if(i + 1 == n) {
                    cout << "YES\n";
                    return 0;
                }
                visited[i + 1][mask ^ x] = 1;
                q.push({i + 1, mask ^ x});
            }
        }
    }
    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...