Submission #582477

#TimeUsernameProblemLanguageResultExecution timeMemory
5824771neBank (IZhO14_bank)C++14
100 / 100
989 ms86708 KiB
#include<bits/stdc++.h>
using namespace std;

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	int n,m;cin>>n>>m;
	vector<int>arr(n);
	for (int i = 0;i<n;++i)cin>>arr[i];
	vector<int>brr(m);
	for (int i = 0 ;i<m;++i)cin>>brr[i];
	sort(brr.begin(),brr.end());
	vector<vector<int>>pos(n);
	for (int i = 0;i < (1<<m);++i){
		vector<int>cur;
		for (int j = 0;j<m;++j){
			if (i & (1<<j)){
				cur.push_back(brr[j]);
			}
		}
		set<int>c;
		c.insert(0);
		for (auto x:cur){
			set<int>nex;
			for (auto y:c){
				if (y + x <=1000){
					nex.insert(y + x);
				}
			}
			swap(nex,c);
		}
		for (int j = 0;j<n;++j){
			if (c.find(arr[j])!=c.end()){
				pos[j].push_back(i);
			}
		}
	}
	vector<vector<int>>dp(n,vector<int>((1<<20),-1));
	function<bool(int,int)>solve = [&](int u,int mask){
		if (u == n)return 1;
		if (dp[u][mask]!=-1)return dp[u][mask];
		int ans = 0;
		for (auto x:pos[u]){
			if ((mask & x))continue;
			ans|=solve(u + 1,(mask | x));
		}
		return dp[u][mask] = ans;
	};
	bool ans = solve(0,0);
	if (ans){
		cout<<"YES\n";
	}
	else cout<<"NO\n";
	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...