제출 #100478

#제출 시각아이디문제언어결과실행 시간메모리
100478RockyBBank (IZhO14_bank)C++17
71 / 100
1095 ms86648 KiB
/// In The Name Of God

#include <bits/stdc++.h>

#define f first
#define s second

#define pb push_back
#define pp pop_back
#define mp make_pair

#define sz(x) (int)x.size()
#define sqr(x) ((x) * 1ll * (x))
#define all(x) x.begin(), x.end()

#define rep(i, l, r) for (int i = (l); i < (r); i++)
#define per(i, l, r) for (int i = (l); i >= (r); i--)

#define Kazakhstan ios_base :: sync_with_stdio(0), cin.tie(0), cout.tie(0);

#define nl '\n'
#define ioi exit(0);

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;

const int N = (int)5e5 + 7;
const int inf = (int)1e9 + 7;
const int mod = (int)1e9 + 7;
const ll linf = (ll)1e18 + 7;

const int dx[] = {-1, 0, 1, 0, 1, -1, -1, 1};
const int dy[] = {0, 1, 0, -1, 1, -1, 1, -1};

using namespace std;

int n, m;
int a[N], b[N];

int sum[1 << 20];
int dp[20][1 << 20];
int calc(int v = 0, int mask = (1 << m) - 1) {
	if (v == n) return 1;
	if (~dp[v][mask]) return dp[v][mask];
	int res = 0;
	for (int j = mask; !res;j = mask & (j - 1)) {
		if (!j) break;
		if (a[v] == sum[j]) {
			res |= calc(v + 1, mask ^ j);
		}
	}
	return dp[v][mask] = res;
}
int main() {
	#ifdef IOI2018
		freopen ("in.txt", "r", stdin);
	#endif
	Kazakhstan
	cin >> n >> m;
	rep(i, 0, n) cin >> a[i];
	rep(i, 0, m) cin >> b[i];

	rep(mask, 0, (1 << m)) {
		rep(i, 0, m) {
			if (mask & (1 << i)) sum[mask] += b[i];
		}
	}
	memset(dp, -1, sizeof(dp));
	if (calc()) cout << "YES";
	else cout << "NO";
	ioi
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...