Submission #1326155

#TimeUsernameProblemLanguageResultExecution timeMemory
1326155pfangBank (IZhO14_bank)C++20
0 / 100
37 ms86628 KiB
#include <bits/stdc++.h>
using namespace std;
using lli = long long;

int f[21][1 << 20];

int main(){
    ios_base::sync_with_stdio(0); 
    cin.tie(0);

    int n, m;
    cin >> n >> m;

    vector<int> a(n);
    lli sum_a = 0;
    for(int i = 0; i < n; ++i){
        cin >> a[i];
        sum_a += a[i];
    }

    vector<int> b(m);
    lli sum_b = 0;
    for(int i = 0; i < m; ++i){
        cin >> b[i];
        sum_b += b[i];
    }

    // Necessary condition
    if(sum_a != sum_b){
        cout << "NO\n";
        return 0;
    }

    int total_masks = 1 << m;

    // Precompute subset sums
    vector<int> total(total_masks, 0);
    for(int mask = 1; mask < total_masks; ++mask){
        int bit = __builtin_ctz(mask);
        int prev = mask ^ (1 << bit);
        total[mask] = total[prev] + b[bit];
    }

    // For each person, store masks that match their salary
    vector<vector<int>> good_mask(n);
    for(int i = 0; i < n; ++i){
        for(int mask = 0; mask < total_masks; ++mask){
            if(total[mask] == a[i]){
                good_mask[i].push_back(mask);
            }
        }
    }

    // DP
    int full_mask = (1 << m) - 1;

    memset(f, 0, sizeof(f));
    f[0][0] = 1;

    for(int i = 0; i < n; ++i){
        for(int mask = 0; mask < total_masks; ++mask){
            if(!f[i][mask]) continue;

            for(auto x : good_mask[i]){
                if((x & mask) == 0){
                    f[i + 1][mask | x] = 1;
                }
            }
        }
    }

    // Since sums are equal, we must use ALL banknotes
    cout << (f[n][full_mask] ? "YES" : "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...