제출 #1265061

#제출 시각아이디문제언어결과실행 시간메모리
1265061nguyenhuuphuc52Bank (IZhO14_bank)C++20
100 / 100
126 ms8648 KiB
#include <iostream>

#define fi first
#define se second

using namespace std;
using ll = long long;

const int mod = 1e9 + 7;
const int maxn = 21;

int n, m;
int a[maxn], b[maxn];
pair <int, int> dp[10000007];

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int j = 1; j <= m; j++) cin >> b[j];
    for (int mask = 1; mask < (1 << m); mask++) {
        for (int i = 1; i <= m; i++) if ((mask >> (i - 1)) & 1) {
            int prevmask = mask ^ (1 << (i - 1));
            int sn = dp[prevmask].fi, sodu = dp[prevmask].se;
            if (sodu + b[i] < a[sn + 1]) {
                dp[mask] = max (dp[mask], {sn, sodu + b[i]});
            }
            else if (sodu + b[i] == a[sn + 1]) {
                dp[mask] = max (dp[mask], {sn + 1, 0});
            }
        }
    }
    //cout << dp[0].fi << " " << dp[0].se << "\n";
    //cout << dp[(1 << (m - 1)) - 1].fi << " " << dp[(1 << (m - 1)) - 1].se << "\n";
    //if (dp[(1 << (m - 1)) - 1].fi == n) cout << "YES";
    //else cout << "NO";
    bool ok = false;
    for (int mask = 0; mask < (1 << m); mask++) if (dp[mask].fi == n) {
        cout << "YES";
        ok = true;
        break;
    }
    if (!ok) cout << "NO";
    return 0;
}
// AC
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...