Submission #1237978

#TimeUsernameProblemLanguageResultExecution timeMemory
1237978JerBank (IZhO14_bank)C++20
71 / 100
1098 ms49852 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 25;
const int MAXM = 25;

int n, m;
int a[MAXN], b[MAXM];
vector<int> sum_subsets[1005];
set<long long> memo;

void generate_subsets()
{
    int total = 1 << m;
    for (int mask = 1; mask < total; mask++)
    {
        int sum = 0;
        for (int i = 0; i < m; i++)
            if ((mask >> i) & 1)
                sum += b[i];
        if (sum <= 1000)
            sum_subsets[sum].push_back(mask);
    }
}

long long state_key(int curr, int used_mask)
{
    return ((long long)curr << 20) | used_mask;
}

bool dfs(int curr, int used_mask)
{
    if (curr == n)
        return true;

    long long key = state_key(curr, used_mask);
    if (memo.count(key))
        return false;

    int target = a[curr];
    for (int mask : sum_subsets[target])
        if ((mask & used_mask) == 0)
            if (dfs(curr + 1, used_mask | mask))
                return true;

    memo.insert(key);
    return false;
}

int main()
{
    scanf("%d%d", &n, &m);

    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);

    for (int i = 0; i < m; i++)
        scanf("%d", &b[i]);

    sort(a, a + n, greater<int>());

    generate_subsets();

    printf("%s\n", dfs(0, 0) ? "YES" : "NO");

    return 0;
}

Compilation message (stderr)

bank.cpp: In function 'int main()':
bank.cpp:53:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   53 |     scanf("%d%d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~
bank.cpp:56:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   56 |         scanf("%d", &a[i]);
      |         ~~~~~^~~~~~~~~~~~~
bank.cpp:59:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |         scanf("%d", &b[i]);
      |         ~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...