#include<bits/stdc++.h>
using namespace std;
int dp[1<<20],a[21],b[21],mp[1005*20],n,m,cnt = 1;
vector<int> subset[1005];
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i++)
{
cin >> a[i];
if(!mp[a[i]]) mp[a[i]] = cnt++;
}
for(int i = 1;i <= m;i++)
cin >> b[i];
for(int mask = 0;mask < (1<<m);mask++)
{
int cur = 0;
for(int j = 0;j < m;j++)
if(mask&(1<<j)) cur += b[j+1];
if(mp[cur]) subset[cur].push_back(mask);
}
for(int mask = 0;mask < (1<<m);mask++)
{
int cur = 0,ok = 0;
for(int j = 0;j < m;j++)
if(mask&(1<<j)) cur = max(cur,dp[mask^(1<<j)]);
for(auto x:subset[a[cur+1]])
if((x&mask) == x && dp[mask^x] == cur)
{
cur++;
break;
}
dp[mask] = cur;
}
if(dp[(1<<m)-1] == n) cout << "YES\n";
else cout << "NO\n";
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... |