#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("O2")
using namespace std;
const int Maxn = 55;
const double EPS = 1e-8;
int dcmp(double x) { return x < -EPS ? -1 : x > EPS ? 1 : 0; }
int nf, ne, ns, n, c[Maxn];
double rf, re, rs, de, ds;
int fl[Maxn], fr[Maxn], el[Maxn], er[Maxn], sl[Maxn], sr[Maxn];
vector<double> pos, val;
double a[Maxn], b[Maxn], ans = 0.0, dp[Maxn][Maxn];
double calc() {
  memset(dp, 0.0, sizeof(dp));
  double res = 0;
  for (int p = 0; p < n; ++p) {
    a[p] = b[p] = 0;
    if (ne)
      for (int i = el[p] + 1; i <= er[p]; ++i) a[p] += val[i];
    a[p] *= de;
    if (ns)
      for (int i = sl[p] + 1; i <= sr[p]; ++i) b[p] += val[i];
    b[p] *= ds;
    for (int iters = c[p]; iters--;) {
      for (int i = 0; i <= ne; ++i)
        for (int j = 0; j <= ns; ++j) {
          if (i) dp[i - 1][j] = max(dp[i - 1][j], dp[i][j] + a[p]);
          if (j) dp[i][j - 1] = max(dp[i][j - 1], dp[i][j] + b[p]);
        }
      res = max(res, dp[0][0]);
    }
  }
  return res;
}
void dfs(int u, int left) {
  if (left < 0 || (n - u) * 2 < left) return;
  if (u == n) {
    if (!left) {
      ans = max(ans, calc());
      return;
    } else
      return;
  }
  c[u] = 2;
  dfs(u + 1, left - 0);
  if (!left) return;
  c[u] = 1;
  for (int i = fl[u] + 1; i <= fr[u]; ++i) val[i] += (pos[i] - pos[i - 1]) * 1;
  dfs(u + 1, left - 1);
  for (int i = fl[u] + 1; i <= fr[u]; ++i) val[i] -= (pos[i] - pos[i - 1]) * 1;
  if (left == 1) return;
  c[u] = 0;
  for (int i = fl[u] + 1; i <= fr[u]; ++i) val[i] += (pos[i] - pos[i - 1]) * 2;
  dfs(u + 1, left - 2);
  for (int i = fl[u] + 1; i <= fr[u]; ++i) val[i] -= (pos[i] - pos[i - 1]) * 2;
}
int main() {
  cin >> ne >> ns >> nf >> re >> rs >> rf >> de >> ds;
  rf = sqrt(rf * rf - 1.0);
  re = sqrt(re * re - 1.0);
  rs = sqrt(rs * rs - 1.0);
  if (rf < EPS) nf = 0;
  if (re < EPS) ne = 0;
  if (rs < EPS) ns = 0;
  if (ne + ns == 0) return (int)printf("0.00000000000000000000") * 0;
  n = nf + ne + ns;
  n = (n + 1) / 2;
  memset(c, 0, sizeof(c));
  for (int i = 0; i < n; ++i) {
    if (nf) pos.push_back(i - rf), pos.push_back(i + rf);
    if (ne) pos.push_back(i - re), pos.push_back(i + re);
    if (ns) pos.push_back(i - rs), pos.push_back(i + rs);
  }
  sort(pos.begin(), pos.end());
  pos.erase(unique(pos.begin(), pos.end()), pos.end());
  for (int i = 0; i < n; ++i) {
    if (nf)
      fl[i] = lower_bound(pos.begin(), pos.end(), i - rf - EPS) - pos.begin(),
      fr[i] = lower_bound(pos.begin(), pos.end(), i + rf - EPS) - pos.begin();
    if (ne)
      el[i] = lower_bound(pos.begin(), pos.end(), i - re - EPS) - pos.begin(),
      er[i] = lower_bound(pos.begin(), pos.end(), i + re - EPS) - pos.begin();
    if (ns)
      sl[i] = lower_bound(pos.begin(), pos.end(), i - rs - EPS) - pos.begin(),
      sr[i] = lower_bound(pos.begin(), pos.end(), i + rs - EPS) - pos.begin();
  }
  val = vector<double>(pos.size(), 0.0);
  for (int i = 1; i < (int)val.size(); ++i) val[i] = pos[i] - pos[i - 1];
  dfs(0, nf);
  printf("%.20lf\n", ans);
  return 0;
}
