Submission #1304349

#TimeUsernameProblemLanguageResultExecution timeMemory
1304349Euclid73Bank (IZhO14_bank)C++20
71 / 100
1093 ms10656 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long

const ll MAXN=20;
const ll MAXM=20;

ll n, m, a[MAXN], b[MAXM], s[1<<MAXM];
bool dp[2][1<<MAXM], ans;

int main()
{
    cin >> n >> m;
    for (int i=0; i<n; i++)
    {
        cin >> a[i];
    }
    for (int i=0; i<m; i++)
    {
        cin >> b[i];
    }
    for (int i=0; i<(1<<m); i++)
    {
        for (int j=0; j<m; j++)
        {
            if (i & (1<<j))
            {
                s[i]+=b[j];
            }
        }
    }
    dp[0][0]=1;
    for (int i=0; i<n; i++)
    {
        for (int j=0; j<(1<<m); j++)
        {
            dp[(i+1)%2][j]=0;
        }
        for (int cur = 0; cur < (1 << m); cur++)
        {
            if (dp[i%2][cur]==0)
            {
                continue;
            }
            ll mask=(1<<m)-1-cur;
            for (int submask = mask; submask >= 0; submask = (submask - 1) & mask)
            {
                int subset = mask ^ submask;
                if (s[subset]==a[i])
                {
                    dp[(i+1)%2][cur+subset]=1;
                }
                if (submask==0)
                {
                    break;
                }
            }
        }
    }
    for (int i=0; i<(1<<m); i++)
    {
        ans|=dp[n%2][i];
    }
    cout << (ans ? "YES":"NO") << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...