Submission #1204438

#TimeUsernameProblemLanguageResultExecution timeMemory
1204438sopaipillaBank (IZhO14_bank)C++20
71 / 100
1025 ms452 KiB
#include <bits/stdc++.h>
#define pb push_back
#define fst first
#define snd second
using namespace std;

int n, m, ans=0;
array<int,20> a, b, pf;
array<pair<int,set<int>>,20> subset;

void search(int i, int j) {
    if(ans) return;
    int qtd=subset[i].fst;
    if(qtd==pf[i]) {
        if(i==(n-1)) {
            ans=1;
            return;
        }
        subset[i+1]=subset[i];
        search(i+1,0);
    } else if(qtd<pf[i]) {
        if(j==m) return;
        search(i,j+1);
        if(subset[i].snd.find(j)==subset[i].snd.end()) {
            subset[i].snd.insert(j);
            subset[i].fst+=b[j];
            search(i,j+1);
            subset[i].snd.erase(j);
            subset[i].fst-=b[j];
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin >> n >> m;
    for(int i=0; i<n; ++i) {
        cin >> a[i];
        if(!i) pf[i]=a[i];
        else pf[i] = pf[i-1]+a[i];
    }
    for(int i=0; i<m; ++i) cin >> b[i];
    
    if(n>m) {
        cout << "NO";
        return 0;
    }
    if(n==m) {
        array<int,20> vst;
        vst.fill(0);
        bool flag;
        for(int i=0; i<n; ++i) {
            flag=1;
            for(int j=0; j<m; ++j) {
                if(b[j]==a[i] and !vst[j]) {
                    vst[j]=1;
                    flag=0;
                    break;
                }
            }
            if(flag) {
                cout << "NO";
                return 0;
            }
        }
        cout << "YES";
        return 0;
    }
    
    search(0,0);
    if(ans) cout << "YES";
    else cout << "NO";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...