Submission #765457

#TimeUsernameProblemLanguageResultExecution timeMemory
765457AutomatiC__Bank (IZhO14_bank)C++17
100 / 100
112 ms8548 KiB
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cctype>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cstdlib>
#include <bitset>
#include <deque>
#define inf 0x3f3f3f3f
#define infll 0x3f3f3f3f3f3f3f3fll
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 20;
pair<int, int> f[1 << maxn];
int a[maxn], b[maxn];
int main() {
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	for (int i = 0; i < m; i++) {
		cin >> b[i];
	}
	sort(a, a + n, greater<int>());
	sort(b, b + m, greater<int>());
	f[0] = make_pair(0, 0);
	for (int s = 1; s < (1 << m); s++) {
		f[s] = make_pair(0, 0);
		for (int i = 0; i < m; i++) {
			if (~s & (1 << i)) continue;
			pair<int, int> pre = f[s ^ (1 << i)];
			if (pre.second + b[i] == a[pre.first]) {
				pre.first++;
				pre.second = 0;
			} else if (pre.second + b[i] < a[pre.first]) {
				pre.second += b[i];
			}
			f[s] = max(f[s], pre);
		}
	}
	for (int s = 0; s < (1 << m); s++) {
		if (f[s].first >= n) {
			cout << "YES" << endl;
			return 0;
		}
	}
	cout << "NO" << endl;
	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...