#include <bits/stdc++.h>
using namespace std ;
#define int long long
#define BIT(x , i) (((x) >> (i)) & 1)
#define MASK(i) (1ll << (i))
#define pb push_back
#define endl '\n'
#define LOG 19
const int INF = -100 ;
void process(void) {
int n , m ; cin >> n >> m ;
vector <int> a(n + 1) , b(m + 1) ;
for(int i = 1 ; i <= n ; ++i) {
cin >> a[i] ;
}
for(int i = 1 ; i <= m ; ++i) {
cin >> b[i] ;
}
int fullMask = MASK(m) ;
vector <int> dp(fullMask , INF) , sum(fullMask) ;
sum[0] = dp[0] = 0 ;
for(int i = 1 ; i <= m ; ++i) {
sum[MASK(i - 1)] = b[i] ;
}
for(int mask = 0 ; mask < fullMask ; ++mask) {
if(__builtin_popcount(mask) <= 1) continue ;
int sub = mask & -mask ;
sum[mask] = sum[sub] + sum[mask ^ sub] ;
}
vector <int> op[n + 1] ;
for(int i = 1 ; i <= n ; ++i) {
for(int mask = 0 ; mask < fullMask ; ++mask) {
if(sum[mask] == a[i]) {
op[i].pb(mask) ;
}
}
}
for(int mask = 0 ; mask < fullMask ; ++mask) {
if(dp[mask] == INF) continue ;
if(dp[mask] == n) break ;
int nextPos = dp[mask] + 1 , need = a[nextPos] ;
for(int sub : op[nextPos]) {
if(sub & mask == 0) {
dp[mask | sub] = max(dp[mask | sub] , dp[mask] + 1) ;
}
}
}
for(int mask = 0 ; mask < fullMask ; ++mask) {
if(dp[mask] == n) {
cout << "YES\n" ;
return ;
}
}
cout << "NO\n" ;
}
int32_t main(void) {
ios_base :: sync_with_stdio(false) ;
cin.tie(nullptr) ;
cout.tie(nullptr) ;
process() ;
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... |