제출 #1355784

#제출 시각아이디문제언어결과실행 시간메모리
1355784Matjaz은행 (IZhO14_bank)C++20
71 / 100
1097 ms46788 KiB
//
// Created by matjaz on 4/19/26.
//

#include<iostream>
#include <map>
#include<vector>
using namespace std;

map<pair<int,int>, bool> dp;
map<int,vector<int> > sets;
vector<int> sums;

int N,M;
vector<int> a,b;

bool subset(int A,int B) {
    return (A & B) == A;
}

bool possible(int s, int x) {
    //cout << s << " " << x << endl;
    if (x == N) { return true;}
    if (dp.count(make_pair(s,x)) == 0) {
        bool res = false;
        vector<int> v = sets[a[x]];
        for (int i=0;i<v.size();i++) {
            if (subset(v[i], s)) {
                res = res || possible(s ^ v[i], x + 1);
            }
        }
        return dp[make_pair(s,x)] = res;
    } else return dp[make_pair(s,x)];
}


int main() {
    cin >> N >> M;
    a.assign(N, 0);
    b.assign(M, 0);

    for (int i=0;i<N;i++) {cin >> a[i];}
    for (int i=0;i<M;i++) {cin >> b[i];}

    for (int i=0;i<N;i++) {
        if (sets.find(a[i]) == sets.end()) {sets[a[i]]= vector<int>();}

    }
    sums.assign(1<<M, 0);
    sums[0] = 0;
    for (int i=1;i<1<<M;i++) {
        int removed = i & -i;
        sums[i] = sums[i ^ removed] + b[__builtin_ctz(removed)];
        if (sets.count(sums[i]) == 1) {
            sets[sums[i]].push_back(i);
        }
    }

    cout << (possible((1<<M) - 1,0) ? "YES" : "NO") << endl;


    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…