Submission #795051

#TimeUsernameProblemLanguageResultExecution timeMemory
795051nguyenneheheBank (IZhO14_bank)C++14
100 / 100
102 ms8532 KiB
#include<bits/stdc++.h>
using namespace std;

const int N = 20;

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

void sub1() {
  bool ok = false;
  for (int s = 1; s < (1 << m); ++s) {
    int sum = 0;
    for (int i = 0; i < m; ++i) {
      if (s >> i & 1) sum += b[i];
    }

    ok |= sum == a[0];
  }

  cout << (ok ? "YES" : "NO");
}

void sub2() {
  bool good = false;
  sort(b, b + m);
  do {
    bool ok = true;
    for (int i = 0, j = 0; i < n; ++i) {
      int sum = 0;
      while (j < m && sum < a[i]) {
        sum += b[j];
        j += 1;
      }
      ok &= sum == a[i];
    }
    good |= ok;

    if (good) break;
  } while (next_permutation(b, b + m));
  cout << (good ? "YES": "NO");
}

template<typename T>
void maximize(T &x, T y) {
  if (x < y) x = y;
}

void sub3() {
  vector<int> sum(1 << m);
  for (int s = 1; s < (1 << m); ++s) {
    int cur = 0;
    for (int i = 0; i < m; ++i) {
      if (s >> i & 1) cur += b[i];
    }
    sum[s] = cur;
  }
  vector<vector<int>> dp(n, vector<int>(1 << m));
  for (int s = 0; s < (1 << m); ++s) {
    if (sum[s] == a[0]) dp[0][s] = 1;
  }
  for (int i = 1; i < n; ++i) {
    dp[i] = dp[i - 1];

    for (int s = 0; s < (1 << m); ++s) {
      int msk = ((1 << m) - 1) ^ s;
      for (int x = msk; ; x = (x - 1) & msk) {
        if (sum[x] == a[i]) {
          maximize(dp[i][s | x], dp[i - 1][s] + 1);
        }
        if (x == 0) break;
      }
    }
  }

  bool good = false;
  for (int s = 0; s < (1 << m); ++s) {
    if (dp[n - 1][s] == n) good = true;
  }
  cout << (good ? "YES": "NO");
}

void sub4() {
  vector<pair<int, int>> dp(1 << m, {-1, 0}); // (pp, left)
  dp[0] = {0, 0};
  for (int s = 0; s < (1 << m); ++s) {
    for (int i = 0; i < m; ++i) {
      if (s >> i & 1) continue;
      int sum = dp[s].second + b[i];
      int pp = dp[s].first;
      if (sum == a[pp]) {
        pp += 1;
        sum = 0;
      }

      maximize(dp[s | (1 << i)], {pp, sum});
    }
  }

  auto [x, y] = *max_element(dp.begin(), dp.end());
  if (x == n) cout << "YES";
  else cout << "NO";
}

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  cin >> n >> m;
  for (int i = 0; i < n; ++i) cin >> a[i];
  for (int i = 0; i < m; ++i) cin >> b[i];

  sub4();
}

Compilation message (stderr)

bank.cpp: In function 'void sub4()':
bank.cpp:98:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   98 |   auto [x, y] = *max_element(dp.begin(), dp.end());
      |        ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...