제출 #1272666

#제출 시각아이디문제언어결과실행 시간메모리
1272666osmiyum은행 (IZhO14_bank)C++20
100 / 100
355 ms20828 KiB
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n, m;
    if (!(cin >> n >> m)) return 0;
    vector<int> a(n), b(m);
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < m; i++) cin >> b[i];

    // sumMaskList[s] = liste halinde, toplamı s olan banknot mask'leri
    const int MAXSUM = 1000;
    vector<int> sumMaskList[MAXSUM+1];

    int ALL = (int)(1LL << m);
    for (int mask = 0; mask < ALL; ++mask) {
        int sum = 0;
        for (int j = 0; j < m; ++j) {
            if (mask & (1 << j)) sum += b[j];
        }
        if (sum <= MAXSUM) sumMaskList[sum].push_back(mask);
    }

    // dpState[mask] = kaç kişiye ödeme yapılabildiği (ilk dpState[mask] kişiye)
    // -1 = ulaşılamaz
    vector<int> dpState(ALL, -1);
    dpState[0] = 0;

    for (int mask = 0; mask < ALL; ++mask) {
        if (dpState[mask] == -1) continue;
        int paid = dpState[mask];
        if (paid == n) continue; // zaten tüm kişilere ödeme yapılmış
        int need = a[paid]; // sıradaki kişinin ihtiyacı

        // Tüm alt-mask'lerden değil, önceden toplamı need olan maskleri kullan
        for (int s : sumMaskList[need]) {
            if ((mask & s) == 0) {
                int nmask = mask | s;
                if (dpState[nmask] < paid + 1) {
                    dpState[nmask] = paid + 1;
                }
            }
        }
    }

    bool ok = false;
    for (int mask = 0; mask < ALL; ++mask) {
        if (dpState[mask] == n) { ok = true; break; }
    }

    cout << (ok ? "YES" : "NO") << endl;
    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...