Submission #1326144

#TimeUsernameProblemLanguageResultExecution timeMemory
1326144pfangBank (IZhO14_bank)C++20
0 / 100
0 ms332 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> salary(N);
    vector<int> notes(M);

    long long sum_salary = 0;
    long long sum_notes = 0;

    for(int i = 0; i < N; i++){
        cin >> salary[i];
        sum_salary += salary[i];
    }

    for(int i = 0; i < M; i++){
        cin >> notes[i];
        sum_notes += notes[i];
    }

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

    // Sort salaries descending (important pruning)
    sort(salary.rbegin(), salary.rend());

    int total_masks = 1 << M;

    // Precompute subset sums
    vector<int> subset_sum(total_masks, 0);

    for(int mask = 1; mask < total_masks; mask++){
        int lowest_bit = __builtin_ctz(mask);
        int prev_mask = mask ^ (1 << lowest_bit);
        subset_sum[mask] = subset_sum[prev_mask] + notes[lowest_bit];
    }

    // dp[mask] = how many people we have paid using exactly this mask
    vector<int> dp(total_masks, -1);
    dp[0] = 0;

    for(int mask = 0; mask < total_masks; mask++){
        if(dp[mask] == -1) continue;

        int paid = dp[mask];
        if(paid == N) continue;

        int remaining = ((1 << M) - 1) ^ mask;

        // iterate over all submasks of remaining
        for(int sub = remaining; sub; sub = (sub - 1) & remaining){
            if(subset_sum[sub] == salary[paid]){
                int new_mask = mask | sub;
                dp[new_mask] = max(dp[new_mask], paid + 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...