#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
bool canPayAllSalaries(vector<int>& salaries, vector<int>& banknotes) {
int n = salaries.size();
int m = banknotes.size();
// Iterate over each salary
for (int salary : salaries) {
// DP array to track valid masks for the current salary
vector<bool> dp(1 << m, false);
dp[0] = true; // Base case: no banknotes used sums to 0.
// Process subsets of banknotes
for (int mask = 0; mask < (1 << m); ++mask) {
if (!dp[mask]) continue;
int current_sum = 0;
for (int j = 0; j < m; ++j) {
if (mask & (1 << j)) current_sum += banknotes[j];
}
// Try adding each unused banknote
for (int j = 0; j < m; ++j) {
if (!(mask & (1 << j)) && current_sum + banknotes[j] <= salary) {
dp[mask | (1 << j)] = true;
}
}
}
// Check if we can achieve the current salary
bool canPay = false;
for (int mask = 0; mask < (1 << m); ++mask) {
int sum = 0;
for (int j = 0; j < m; ++j) {
if (mask & (1 << j)) sum += banknotes[j];
}
if (sum == salary) {
canPay = true;
// Remove used banknotes
vector<int> new_banknotes;
for (int j = 0; j < m; ++j) {
if (!(mask & (1 << j))) new_banknotes.push_back(banknotes[j]);
}
banknotes = new_banknotes;
m = banknotes.size();
break;
}
}
if (!canPay) return false;
}
return true;
}
int main() {
int n, m;
cin >> n >> m;
vector<int> salaries(n), banknotes(m);
for (int i = 0; i < n; ++i) cin >> salaries[i];
for (int i = 0; i < m; ++i) cin >> banknotes[i];
if (canPayAllSalaries(salaries, banknotes)) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |