Submission #713806

#TimeUsernameProblemLanguageResultExecution timeMemory
713806egregiousBank (IZhO14_bank)C++14
0 / 100
8 ms3668 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int n, m, a[N], b[N], dp[(1 << N)], sum[(1 << N)];
vector<int> sums[1001]; // sums[i] -> all sets that sum to i
// dp[s] -> max prefix a[0, i) that can be formed using the banknotes in set s
int main() {
	cin >> n >> m;
	for (int i = 0; i < n; i++) cin >> a[i];
	for (int i = 0; i < m; i++) cin >> b[i];
	for (int s = 0; s < (1 << m); s++) {
		sums[sum[s]].push_back(s);
		for (int j = 0; j < m; j++) {
			if (!(s & (1 << j))) sum[s | (1 << j)] = sum[s] + b[j];
		}
	}
	dp[0] = 0;
	bool pos = false;
	for (int s = 0; s < (1 << m); s++) {
		if (dp[s] == n) {
			pos = true;
			break;
		}
		for (int k : sums[a[dp[s]]]) {
			if (k & s) continue; // intersect
			dp[k | s] = max(dp[k | s], dp[s] + 1);
		}
	}
	cout << (pos ? "YES" : "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...