#include <bits/stdc++.h>
using namespace std;
int n, m;
bool debug = false;
int k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
int nf, ne, ns, df, de, cs[25];
double ce[25], cf[25], dp[25][25];
double rf, re, rs, ans;
void cg(double &x) { x = sqrt(x * x - 1); }
double cross(int a, int b, double r) {
  return max(min(a + r, b + rs) - max(a - r, b - rs), 0.0);
}
void cal() {
  for (int(i) = 0; (i) < (int)(n); (i)++)
    if (!cs[i]) {
      ce[i] = 2 * re;
      cf[i] = 2 * rf;
      for (int(j) = 0; (j) < (int)(n); (j)++)
        if (cs[j]) {
          ce[i] += cross(i / 2, j / 2, re);
          cf[i] += cross(i / 2, j / 2, rf);
        }
      ce[i] *= de;
      cf[i] *= df;
    }
  for (int(i) = 0; (i) < (int)(25); (i)++)
    for (int(j) = 0; (j) < (int)(25); (j)++) dp[i][j] = -1e9;
  dp[0][0] = 0;
  for (int(i) = 0; (i) < (int)(n); (i)++) {
    for (int(j) = 0; (j) < (int)(ne + 1); (j)++)
      if (dp[i][j] >= 0) {
        if (cs[i]) {
          dp[i + 1][j] = dp[i][j];
          continue;
        }
        if (j < ne) {
          dp[i + 1][j + 1] = max(dp[i + 1][j + 1], dp[i][j] + ce[i]);
        }
        dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + cf[i]);
      }
  }
  ans = max(ans, dp[n][ne]);
}
void dfs(int x, int freeze) {
  if (x + ns - freeze > n) return;
  if (x == n) {
    cal();
    return;
  }
  dfs(x + 1, freeze);
  if (freeze < ns) {
    cs[x] = 1;
    dfs(x + 1, freeze + 1);
    cs[x] = 0;
  }
}
int main() {
  cin >> nf >> ne >> ns >> rf >> re >> rs >> df >> de;
  cg(rf);
  cg(re);
  cg(rs);
  n = nf + ne + ns;
  dfs(0, 0);
  printf("%.10lf\n", ans);
  return 0;
}
