Submission #1225557

#TimeUsernameProblemLanguageResultExecution timeMemory
1225557vyaductBank (IZhO14_bank)C++20
100 / 100
101 ms8620 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int mxN = 20;
const int mxD = 1<<mxN;
int a[mxN];
int b[mxN];
int dp[mxD][2];

void solve(){
  int n,m; cin>>n>>m;
  for (int i=0;i<n;i++) cin>>a[i];
  for (int i=0;i<m;i++) cin>>b[i];
  bool ans=false;
  memset(dp, -1, sizeof(dp));
  dp[0][0] = 0;
  dp[0][1] = 0;
  for (int S=1;S<(1<<m);S++){
    // dp[S][0] = max prefix of ppl we can pay
    // dp[S][1] = leftover after paying them
    for (int i=0;i<m;i++){
      if (S & (1<<i) == 0) continue;
      int prev = S^(1<<i);
      if (dp[prev][0] == -1) continue;
    
      int have = dp[prev][1] + b[i];
      int need = a[dp[prev][0]];

      if (have < need){
        dp[S][0] = dp[prev][0];
        dp[S][1] = have;
      }
      else if (have == need){
        dp[S][0] = dp[prev][0]+1;
        dp[S][1] = 0;
      }
    }
    if (dp[S][0] == n) ans = true;
  }
  cout << (ans ? "YES" : "NO") << endl;
}

int main(){
  solve();
  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...