Submission #1189711

#TimeUsernameProblemLanguageResultExecution timeMemory
1189711luffy15Bank (IZhO14_bank)C++20
19 / 100
1095 ms868 KiB
#include <iostream>
#include <vector>
using namespace std;

// Function to check if it's possible to pay exact salaries using available banknotes
bool canPaySalaries(vector< int > &salaries, vector< int > &banknotes, int person, vector< bool > &used) {
    if ( person == salaries.size( ) )
        return true; // All salaries paid

    int salary = salaries[person];

    // Try each banknote combination that sums to the current salary
    for ( int i = 0 ; i < banknotes.size( ) ; i++ ) {
        if ( !used[i] && banknotes[i] <= salary ) {
            if ( banknotes[i] == salary ) {
                used[i] = true;
                if ( canPaySalaries( salaries , banknotes , person + 1 , used ) )
                    return true;
                used[i] = false;
            } else {
                // Try to combine with other banknotes
                used[i] = true;
                if ( canPaySalaries( salaries , banknotes , person , used ) )
                    return true;
                used[i] = false;
            }
        }
    }

    return false;
}

int main() {
    int N, M;
    cin >> N >> M;

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

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

    // If sum of banknotes is less than sum of salaries, it's impossible
    long long sum_salaries = 0, sum_banknotes = 0;
    for ( int s: salaries )
        sum_salaries += s;
    for ( int b: banknotes )
        sum_banknotes += b;

    if ( sum_banknotes < sum_salaries ) {
        cout << "NO" << endl;
        return 0;
    }

    // For N=1 case (Subtask 1), check if any combination of banknotes sums to salary
    if ( N == 1 ) {
        int target = salaries[0];
        vector< bool > dp( target + 1 , false );
        dp[0] = true;

        for ( int b: banknotes ) {
            for ( int j = target ; j >= b ; j-- ) {
                dp[j] = dp[j] | dp[j - b];
            }
        }

        cout << (dp[target] ? "YES" : "NO") << endl;
        return 0;
    }

    // For general case, use backtracking
    vector< bool > used( M , false );
    cout << (canPaySalaries( salaries , banknotes , 0 , used ) ? "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...