제출 #633491

#제출 시각아이디문제언어결과실행 시간메모리
633491therealpain은행 (IZhO14_bank)C++17
100 / 100
114 ms8600 KiB
#include <bits/stdc++.h> 
#define fi first 
#define se second
#define getbit(x, i) (((x) >> (i)) & 1)
#define all(x) x.begin(), x.end()
#define TASK ""
 
using namespace std;
 
template <typename T1, typename T2> bool mini(T1 &a, T2 b) {
	if (a > b) {a = b; return true;} return false;
}
template <typename T1, typename T2> bool maxi(T1 &a, T2 b) {
	if (a < b) {a = b; return true;} return false;
}
 
const long long INF = 1e18;
const int mod = 1e9 + 7;

int dp[1 << 20], leftover[1 << 20]; 

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int n, m;
	cin >> n >> m;
	vector <int> a(n), b(m);
	for (int &i : a) cin >> i;
	for (int &i : b) cin >> i;
	for (int i = 0; i < (1 << 20); ++i) leftover[i] = dp[i] = -1;
	leftover[0] = dp[0] = 0;
	for (int mask = 0; mask < (1 << m); ++mask) 
		for (int i = 0; i < m; ++i) {
			if (!getbit(mask, i)) continue;
			int prev = mask ^ (1 << i);
			if (dp[prev] == -1) continue;
			int new_amt = leftover[prev] + b[i];
			int cur_target = a[dp[prev]];
			if (new_amt < cur_target) {
				dp[mask] = dp[prev];
				leftover[mask] = new_amt;
			} else if (new_amt == cur_target) {
				dp[mask] = dp[prev] + 1;
				leftover[mask] = 0;
			}
			if (dp[mask] == n) return cout << "YES", 0;
		}
	cout << "NO\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...