제출 #1272663

#제출 시각아이디문제언어결과실행 시간메모리
1272663osmiyum은행 (IZhO14_bank)C++20
0 / 100
78 ms41380 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; cin >> N >> M; vector<int> a(N), b(M); for (int &x : a) cin >> x; for (int &x : b) cin >> x; int total = accumulate(b.begin(), b.end(), 0); int need = accumulate(a.begin(), a.end(), 0); // toplamlar uymuyorsa direkt imkansız if (total != need) { cout << "NO\n"; return 0; } // her subsetin hangi toplamları oluşturabileceğini bul // subset_sum[mask] -> hangi toplamlar bu mask banknotlarla yapılabiliyor vector< bitset<20005> > subset_sum(1 << M); for (int mask = 0; mask < (1 << M); mask++) { bitset<20005> bs; bs[0] = 1; for (int j = 0; j < M; j++) { if (mask & (1 << j)) { bs |= (bs << b[j]); } } subset_sum[mask] = bs; } // dp[mask][i] = mask banknotları kullanılarak ilk i kişiye ödeme yapılabilir mi? // i = 0..N vector<vector<char>> dp(1 << M, vector<char>(N + 1, 0)); dp[0][0] = 1; for (int mask = 0; mask < (1 << M); mask++) { for (int i = 0; i < N; i++) if (dp[mask][i]) { // bu noktada i kişi ödenmiş durumda // i+1. kişinin maaşı a[i] için uygun subset arıyoruz int remain = ((1 << M) - 1) ^ mask; // kullanılmamış banknotlar // iterate over submasks of remain for (int sub = remain; sub; sub = (sub - 1) & remain) { if (subset_sum[sub][a[i]]) { dp[mask | sub][i + 1] = 1; } } } } if (dp[(1 << M) - 1][N]) cout << "YES\n"; else cout << "NO\n"; 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...