#include <bits/stdc++.h>
using namespace std;
int N, M, a[21], b[21];
vector<int> ok_masks[21];
bool backtrack(int idx, int used_mask) {
    if (idx == N) return true;
    for (int mask : ok_masks[idx]) {
        if ((mask & used_mask) == 0) {
            if (backtrack(idx + 1, used_mask | mask))
                return true;
        }
    }
    return false;
}
int main() {
    cin >> N >> M;
    for (int i = 0; i < N; ++i) cin >> a[i];
    for (int j = 0; j < M; ++j) cin >> b[j];
    // Chuẩn bị các tập con hợp lệ cho từng người
    for (int i = 0; i < N; ++i) {
        ok_masks[i].clear();
        for (int mask = 0; mask < (1 << M); ++mask) {
            int sum = 0;
            for (int j = 0; j < M; ++j)
                if (mask & (1 << j))
                    sum += b[j];
            if (sum == a[i])
                ok_masks[i].push_back(mask);
        }
    }
    // Thử mọi cách ghép tập con cho N người
    if (backtrack(0, 0))
        cout << "YES\n";
    else
        cout << "NO\n";
}
| # | 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... |