제출 #1308413

#제출 시각아이디문제언어결과실행 시간메모리
1308413xnoel은행 (IZhO14_bank)C++20
100 / 100
313 ms94900 KiB
#include <bits/stdc++.h>
using namespace std;

int main(){
    //freopen("1.in","r",stdin);
    int n,m;
    cin>>n>>m;
    vector<int> salary(n),notes(m);
    map<int,vector<int>> mp;
    for (int i=0;i<n;i++) {
        cin>>salary[i];
        mp[salary[i]];
    }


    for (int i=0;i<m;i++) cin>>notes[i];
    int total=(1<<m);
    vector<int> value(total,0);
    for (int mask=1;mask<total;mask++) {
        int first_bit=(1 << (31 - __builtin_clz(mask)));
        value[mask]=value[mask^first_bit]+notes[31-__builtin_clz(first_bit)];
        if (mp.find(value[mask])!=mp.end()) {
            mp[value[mask]].push_back(mask);
        }
    }

    vector<vector<int>> dp(n+1,vector<int>(total,0));
    dp[0][0]=1;
    for (int i=0;i<n;i++) {
        int num=salary[i];
        for (int mask=0;mask<total;mask++) {
            if (dp[i][mask]==0) continue;
            for (int supp_mask: mp[num]) {
                if (mask&supp_mask) continue;
                dp[i+1][mask|supp_mask]=1;
            }
        }
    }
    int ans=count(dp[n].begin(),dp[n].end(),1);
    if (ans==0) cout<<"NO\n";
    else cout<<"YES\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...