Submission #318392

#TimeUsernameProblemLanguageResultExecution timeMemory
318392GurbanBank (IZhO14_bank)C++17
100 / 100
483 ms26396 KiB
#include <bits/stdc++.h>
using namespace std;
// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx,avx2,fma")

using ll = long long;

const int maxn=22;
const int N = 1<<maxn;
int n,m,a[maxn],b[maxn],sum[N],p[maxn],x;
bool can[maxn][N],dp[maxn][N];

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> n >> m;
	for(int i = 1;i <= n;i++) cin >> a[i],p[i]=p[i-1]+a[i];
	for(int i = 0;i < m;i++) cin >> b[i];

	for(int i = 0;i < (1<<m);i++){
		can[0][i]=1;
		for(int j = 0;j < m;j++) if(i & (1<<j)) sum[i] += b[j];
	}

	for(int i = 1;i <= n;i++){
		for(int j = 0;j < (1 << m);j++){
			if(sum[j]==p[i]) can[i][j]=can[i-1][j];
			x = j;
			while(x >= 1){
				int now = x&-x;
				can[i][j] |= can[i][j-now];
				x -= now;
			}
			// for(int k = 0;k < m;k++) if((1<<k) & j) if(can[i][j-(1<<k)] == 1) can[i][j]=1;
		}
	}
	
	// for(int i = 1;i <= n;i++){
	// 	cout<<i<<" ---> ";
	// 	for(int j = 0;j < (1<<m);j++) if(can[i][j] == 1) cout<<j<<' ';
	// 	cout<<'\n';
	// }

	if(can[n][(1<<m) - 1]) cout<<"YES";
	else cout<<"NO";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...