#include <bits/stdc++.h>
using namespace std;
template <class T, class U>
ostream &operator<<(ostream &os, const pair<T, U> &x) {
  return os << "(" << x.first << "," << x.second << ")";
}
namespace dbg_ns {
template <typename C>
struct is_iterable {
  template <class T>
  static long check(...);
  template <class T>
  static char check(int, typename T::const_iterator = C().end());
  enum {
    value = sizeof(check<C>(0)) == sizeof(char),
    neg_value = sizeof(check<C>(0)) != sizeof(char)
  };
};
template <class T>
ostream &_out_str(ostream &os, const T &x) {
  return os << '"' << x << '"';
}
template <class T>
ostream &_dbg2_5(ostream &, const T &);
template <bool B, typename T = void>
using eit = typename enable_if<B, T>::type;
template <class T>
inline ostream &_dbg3(ostream &os, eit<is_iterable<T>::neg_value, const T> &x) {
  return os << x;
}
template <class T>
inline ostream &_dbg3(ostream &os, eit<is_iterable<T>::value, const T> &V) {
  os << "{";
  bool ff = 0;
  for (const auto &E : V) _dbg2_5(ff ? os << "," : os, E), ff = 1;
  return os << "}";
}
template <>
inline ostream &_dbg3<string>(ostream &os, const string &x) {
  return _out_str(os, x);
}
template <>
inline ostream &_dbg3<const char *>(ostream &os, const char *const &x) {
  return _out_str(os, x);
}
template <class T>
inline ostream &_dbg2_5(ostream &os, const T &x) {
  return _dbg3<T>(os, x);
}
template <class T, typename... Args>
ostream &_dbg2(ostream &os, vector<string>::iterator nm, const T &x,
               Args &&...args);
inline ostream &_dbg2(ostream &os, vector<string>::iterator) { return os; }
template <typename... Args>
inline ostream &_dbg2(ostream &os, vector<string>::iterator nm, const char *x,
                      Args &&...args) {
  return _dbg2(_dbg3<const char *>(os << "  ", x), nm + 1, args...);
}
template <class T, typename... Args>
inline ostream &_dbg2(ostream &os, vector<string>::iterator nm, const T &x,
                      Args &&...args) {
  return _dbg2(_dbg3<T>(os << "  " << *nm << "=", x), nm + 1, args...);
}
vector<string> split(string s) {
  vector<string> Z;
  string z = "";
  s += ',';
  int dep = 0;
  for (char c : s) {
    if (c == ',' && !dep)
      Z.push_back(z), z = "";
    else
      z += c;
    if (c == '(') ++dep;
    if (c == ')') --dep;
  }
  return Z;
}
template <typename... Args>
inline ostream &_dbg1(int ln, const string &nm, Args &&...args) {
  auto nms = split(nm);
  return _dbg2(cerr << "L" << ln << ":", nms.begin(), args...) << endl;
}
}  // namespace dbg_ns
typedef long double ld;
const ld eps = (ld)1e-8;
const ld tau = 2 * (ld)acosl(-1);
const int inf = 1e9 + 99;
const long long linf = 1e18 + 99;
const int P = 1e9 + 7;
int n, W, B, X;
long long dp[1024][10 << 10];
long long rr[10 << 10];
int c[1024], cost[1024];
template <class T>
inline void e1(multiset<T> &ms, const T &x) {
  auto it = ms.find(x);
  ms.erase(it);
}
int32_t main() {
  scanf("%d%d%d%d", &n, &W, &B, &X);
  for (int i = 1; i <= n; i++) scanf("%d", c + i);
  for (int i = 1; i <= n; i++) scanf("%d", cost + i);
  for (int i = 0; i <= n; i++)
    for (int j = 0; j <= 10000; j++) dp[i][j] = -linf;
  dp[0][0] = W;
  for (int i = 1; i <= n; i++) {
    multiset<long long> ss;
    ss.insert({-linf, -1});
    for (int j = 0; j <= 10000; j++) {
      rr[j] = min(dp[i - 1][j] + X, 1LL * j * B + W) + 1LL * j * cost[i];
      ss.insert(rr[j]);
      long long z = *ss.rbegin();
      dp[i][j] = z - 1LL * j * cost[i];
      if (dp[i][j] < 0) {
        dp[i][j] = -linf;
        break;
      }
      if (j >= c[i]) e1(ss, rr[j - c[i]]);
    }
  }
  for (int j = 10000; j >= 0; j--)
    if (dp[n][j] >= 0) return printf("%d\n", j), 0;
}
