Submission #519510

#TimeUsernameProblemLanguageResultExecution timeMemory
519510danikoynov은행 (IZhO14_bank)C++14
71 / 100
1010 ms5144 KiB
#include<bits/stdc++.h>

using namespace std;
const int maxn = 20;

int n, m, a[maxn], b[maxn], dp[maxn][(1 << maxn)];
vector < int > g[maxn];
void solve()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i ++)
        cin >> a[i];
    for (int i = 0; i < m; i ++)
        cin >> b[i];

    for (int mask = 0; mask < (1 << m); mask ++)
    {
        int sum = 0;
        for (int bit = 0; bit < m; bit ++)
            if ((mask & (1 << bit)) > 0)
            sum = sum + b[bit];

        for (int i = 1; i <= n; i ++)
            if (a[i] == sum)
                g[i].push_back(mask);
    }

    if (n == 1 && g[1].size() > 0)
    {
        cout << "YES" << endl;
        return;
    }
    for (int mask : g[1])
        dp[1][mask] = 1;

    for (int i = 2; i <= n; i ++)
    {
        for (int mask = 1; mask < (1 << m); mask ++)
        {
            for (int sub_mask : g[i])
            {
                if ((mask & sub_mask) != sub_mask)
                    continue;
                if (dp[i - 1][(mask ^ sub_mask)] == 1)
                    dp[i][mask] = 1;
                if (i == n && dp[i][mask] == 1)
                {
                    cout << "YES" << endl;
                    return;
                }
            }
        }
    }

    cout << "NO" << endl;
}
int main()
{
    solve();
	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...