제출 #1326158

#제출 시각아이디문제언어결과실행 시간메모리
1326158pfang은행 (IZhO14_bank)C++20
0 / 100
1 ms332 KiB
#include <bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(0); cin.tie(0); int N, M; cin >> N >> M; vector<int> a(N), b(M); long long sum_a = 0, sum_b = 0; for(int i = 0; i < N; i++){ cin >> a[i]; sum_a += a[i]; } for(int i = 0; i < M; i++){ cin >> b[i]; sum_b += b[i]; } // Necessary condition if(sum_a != sum_b){ cout << "NO"; return 0; } // Prefix sums of salaries vector<int> pref(N + 1, 0); for(int i = 0; i < N; i++){ pref[i + 1] = pref[i] + a[i]; } // Precompute subset sums vector<int> sum(1 << M, 0); for(int mask = 1; mask < (1 << M); mask++){ int l = mask & -mask; int j = __builtin_ctz(l); sum[mask] = sum[mask ^ l] + b[j]; } vector<int> dp(1 << M, -1); dp[0] = 0; for(int mask = 0; mask < (1 << M); mask++){ if(dp[mask] == -1) continue; int k = dp[mask]; if(k == N) continue; int current_sum = sum[mask]; int filled = current_sum - pref[k]; for(int j = 0; j < M; j++){ if(!(mask & (1 << j))){ int next_fill = filled + b[j]; if(next_fill > a[k]) continue; int new_mask = mask | (1 << j); if(next_fill == a[k]) dp[new_mask] = max(dp[new_mask], k + 1); else dp[new_mask] = max(dp[new_mask], k); } } } // Since total sums match, we must use all notes int full_mask = (1 << M) - 1; cout << (dp[full_mask] == N ? "YES" : "NO"); 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...