#include <bits/stdc++.h>
using namespace std;
int m[3], r[3], d[2];
double F[3];
struct prz {
  double a, b;
  int c;
};
double wsp(prz &x, prz &y) {
  double mn = max(x.a, y.a), mx = min(x.b, y.b);
  if (mx >= mn) return mx - mn;
  return 0.0;
}
double dp[21][21];
int main(void) {
  for (int i = 0; i < (3); ++i) scanf("%d", &m[i]);
  for (int i = 0; i < (3); ++i) {
    scanf("%d", &r[i]);
    F[i] = sqrt(0.0 + r[i] * r[i] - 1.0);
  }
  for (int i = 0; i < (2); ++i) scanf("%d", &d[i]);
  int n = m[2];
  double res = 0.0;
  for (int mask = 0; mask < ((1 << 20)); ++mask) {
    if (__builtin_popcount(mask) != n) continue;
    vector<pair<double, int> > p;
    for (int i = 0; i < (10); ++i) {
      int cnt = 0;
      for (int j = 0; j < (2); ++j) {
        int x = 2 * i + j;
        if (mask & (1 << x)) {
          ++cnt;
        }
      }
      if (cnt > 0) {
        p.push_back(make_pair(0.0 + i - F[2], cnt));
        p.push_back(make_pair(0.0 + i + F[2], -cnt));
      }
    }
    vector<prz> q;
    int cur = 0;
    for (int i = 0; i < (((int)((p).size())) - 1); ++i) {
      cur += p[i].second;
      if (cur > 0) {
        prz tmp;
        tmp.a = p[i].first;
        tmp.b = p[i + 1].first;
        tmp.c = cur;
        q.push_back(tmp);
      }
    }
    vector<pair<double, double> > g;
    for (int i = 0; i < (10); ++i) {
      for (int j = 0; j < (2); ++j) {
        int x = 2 * i + j;
        if (!(mask & (1 << x))) {
          double re[2];
          for (int k = 0; k < (2); ++k) {
            prz w;
            re[k] = 0.0;
            w.a = i - F[k];
            w.b = i + F[k];
            double sum = 0.0;
            for (__typeof((q).begin()) it = (q).begin(); it != (q).end();
                 ++it) {
              sum += wsp(*it, w);
              re[k] += wsp(*it, w) * (it->c + 1) * d[k];
            }
            re[k] += (2.0 * F[k] - sum) * d[k];
          }
          g.push_back(make_pair(re[0], re[1]));
        }
      }
    }
    for (int j = 0; j < (m[0] + 1); ++j) {
      for (int k = 0; k < (m[1] + 1); ++k) dp[j][k] = 0;
    }
    for (int i = 0; i < (((int)((g).size()))); ++i) {
      for (int j = m[0]; j >= 0; --j) {
        for (int k = m[1]; k >= 0; --k) {
          double can = 0.0;
          if (j > 0) can = max(can, dp[j - 1][k] + g[i].first);
          if (k > 0) can = max(can, dp[j][k - 1] + g[i].second);
          dp[j][k] = max(dp[j][k], can);
        }
      }
    }
    res = max(res, dp[m[0]][m[1]]);
  }
  printf("%.10lf\n", res);
  return 0;
}
