제출 #1147411

#제출 시각아이디문제언어결과실행 시간메모리
1147411AlgorithmWarrior은행 (IZhO14_bank)C++20
100 / 100
101 ms8576 KiB
#include <bits/stdc++.h>

using namespace std;

int n,m;
int a[23];
int b[23];

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

struct plata{
    int ind,val;
    bool operator != (plata ot){
        return (ind!=ot.ind || val!=ot.val);
    }
    bool operator == (plata ot){
        return (ind==ot.ind && val==ot.val);
    }
}dp[1050000];

bool get_dp(){
    dp[0]={0,a[0]};
    plata imp={-1,0};
    int i,bit;
    for(i=1;i<(1<<m);++i){
        dp[i]=imp;
        for(bit=0;bit<m;++bit)
            if(i&(1<<bit)){
                int vechi=i^(1<<bit);
                int ind=dp[vechi].ind;
                int new_val=dp[vechi].val-b[bit];
                if(dp[vechi]!=imp && new_val>=0){
                    if(new_val){
                        dp[i].ind=ind;
                        dp[i].val=new_val;
                    }
                    else{
                        dp[i].ind=ind+1;
                        dp[i].val=a[ind+1];
                    }
                }
            }
    }
    plata complet={n,0};
    for(i=1;i<(1<<m);++i)
        if(dp[i]==complet)
            return 1;
    return 0;
}

void write(bool ans){
    cout<<((ans)?"YES":"NO");
}

int main()
{
    read();
    write(get_dp());
    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...