#include <bits/stdc++.h>
using namespace std;
template <typename T>
void dbg(T a) {}
template <typename T, typename... Arg>
void dbg(T a, Arg... arg) {}
const int maxn = (1e6) + 7;
const int maxk = 20;
const int inf = (1e9) + 7;
const long long LLinf = (1e15) + 7;
const long double eps = 1e-9;
const long long mod = 1e9 + 7;
pair<int, int> tab[maxn];
long long dp[50 * 103][53][53];
bool sor(pair<int, int> a, pair<int, int> b) { return a.first > b.first; }
map<int, vector<int> > mapa;
bool por(int a, int b) { return a > b; }
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> tab[i].first;
  for (int i = 1; i <= n; i++) {
    cin >> tab[i].second;
    mapa[-tab[i].first].push_back(tab[i].second);
  }
  long long res = 100000000000000LL;
  for (int i = 0; i < 103 * 50; i++)
    for (int j = 0; j < 52; j++)
      for (int k = 0; k < 52; k++) dp[i][k][j] = LLinf;
  dp[0][0][0] = 0;
  int i = 1;
  for (auto s : mapa) {
    sort(s.second.begin(), s.second.end(), por);
    for (int ile = 0; ile <= ((int)(s.second).size()); ile++) {
      long long suma = 0;
      for (int k = 0; k < ((int)(s.second).size()) - ile; k++)
        suma += s.second[k];
      for (int j = 0; j < 51 * 101; j++)
        for (int wolne = 0; wolne <= n; wolne++) {
          if (j - suma >= 0 &&
              wolne + ile - (((int)(s.second).size()) - ile) >= ile)
            dp[j][i][wolne] =
                min(dp[j][i][wolne],
                    dp[j - suma][i - 1]
                      [wolne + ile - (((int)(s.second).size()) - ile)] -
                        s.first * (((int)(s.second).size()) - ile));
          if (i == ((int)(mapa).size()) && j != 0 && dp[j][i][wolne] > 0)
            res = min(res, (long long)ceil(dp[j][i][wolne] * 1000.0 / j));
        }
    }
    i++;
  }
  cout << res;
  return 0;
}
