Submission #1272663

#TimeUsernameProblemLanguageResultExecution timeMemory
1272663osmiyumBank (IZhO14_bank)C++20
0 / 100
78 ms41380 KiB
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, M;
    cin >> N >> M;
    vector<int> a(N), b(M);
    for (int &x : a) cin >> x;
    for (int &x : b) cin >> x;

    int total = accumulate(b.begin(), b.end(), 0);
    int need = accumulate(a.begin(), a.end(), 0);

    // toplamlar uymuyorsa direkt imkansız
    if (total != need) {
        cout << "NO\n";
        return 0;
    }

    // her subsetin hangi toplamları oluşturabileceğini bul
    // subset_sum[mask] -> hangi toplamlar bu mask banknotlarla yapılabiliyor
    vector< bitset<20005> > subset_sum(1 << M);
    for (int mask = 0; mask < (1 << M); mask++) {
        bitset<20005> bs;
        bs[0] = 1;
        for (int j = 0; j < M; j++) {
            if (mask & (1 << j)) {
                bs |= (bs << b[j]);
            }
        }
        subset_sum[mask] = bs;
    }

    // dp[mask][i] = mask banknotları kullanılarak ilk i kişiye ödeme yapılabilir mi?
    // i = 0..N
    vector<vector<char>> dp(1 << M, vector<char>(N + 1, 0));
    dp[0][0] = 1;

    for (int mask = 0; mask < (1 << M); mask++) {
        for (int i = 0; i < N; i++) if (dp[mask][i]) {
            // bu noktada i kişi ödenmiş durumda
            // i+1. kişinin maaşı a[i] için uygun subset arıyoruz
            int remain = ((1 << M) - 1) ^ mask; // kullanılmamış banknotlar
            // iterate over submasks of remain
            for (int sub = remain; sub; sub = (sub - 1) & remain) {
                if (subset_sum[sub][a[i]]) {
                    dp[mask | sub][i + 1] = 1;
                }
            }
        }
    }

    if (dp[(1 << M) - 1][N]) cout << "YES\n";
    else cout << "NO\n";

    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...