using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Text;
using System.Linq;
using E = System.Linq.Enumerable;
internal partial class Solver {
public void Run() {
var n = ni();
var a = ni(n);
var memo = (double?[,,])Array.CreateInstance(typeof(double?), new[] { 1 << n, 500, 2 }, new int[] { 0, -250, 0 });
double dfs(int used = 0, int diff = 0, int t = 0) {
if (used == (1 << n) - 1) {
if (t == 0) {
return diff > 0 ? 1.0 : 0.0;
} else {
return diff >= 0 ? 1.0 : 0.0;
}
}
ref var ret = ref memo[used, diff, t];
if (!ret.HasValue) {
double val = 0;
for (int i = 0; i < n; i++) {
if (((1 << i) & used) != 0) continue;
double sub = 1.0;
for (int j = 0; j < n; j++) {
if (((1 << j) & used) != 0) continue;
var success1 = InfiniteGeometricProgressionSum(1.0 / a[i], (1.0 - 1.0 / a[j]) * (1.0 - 1.0 / a[i]));
var success2 = 1 - success1;
var sub2 = 0.0;
sub2 += success1 * (1.0 - dfs(used | (1 << i), -(diff + a[i]), 1 - t));
sub2 += success2 * dfs(used | (1 << j), +(diff - a[j]), t);
sub = Math.Min(sub, sub2);
}
val = Math.Max(val, sub);
}
ret = val;
}
return ret.Value;
}
cout.WriteLine("{0}", dfs(0, 0));
}
///
/// 無限等比級数の和 (0 <= r < 1)
///
public static double InfiniteGeometricProgressionSum(double x0, double r) {
return x0 / (1.0 - r);
}
}
// PREWRITEN CODE BEGINS FROM HERE
static public class StringExtensions {
static public string JoinToString(this IEnumerable source, string separator = " ") {
return string.Join(separator, source);
}
}
internal partial class Solver : Scanner {
public static void Main() {
#if LOCAL
byte[] inputBuffer = new byte[1000000];
var inputStream = Console.OpenStandardInput(inputBuffer.Length);
using (var reader = new StreamReader(inputStream, Console.InputEncoding, false, inputBuffer.Length)) {
Console.SetIn(reader);
new Solver(Console.In, Console.Out).Run();
}
#else
Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false });
new Solver(Console.In, Console.Out).Run();
Console.Out.Flush();
#endif
}
#pragma warning disable IDE0052
private readonly TextReader cin;
private readonly TextWriter cout;
private readonly TextWriter cerr;
#pragma warning restore IDE0052
public Solver(TextReader reader, TextWriter writer)
: base(reader) {
cin = reader;
cout = writer;
cerr = Console.Error;
}
public Solver(string input, TextWriter writer)
: this(new StringReader(input), writer) {
}
#pragma warning disable IDE1006
#pragma warning disable IDE0051
private int ni() { return NextInt(); }
private int[] ni(int n) { return NextIntArray(n); }
private long nl() { return NextLong(); }
private long[] nl(int n) { return NextLongArray(n); }
private double nd() { return NextDouble(); }
private double[] nd(int n) { return NextDoubleArray(n); }
private string ns() { return Next(); }
private string[] ns(int n) { return NextArray(n); }
#pragma warning restore IDE1006
#pragma warning restore IDE0051
}
#if DEBUG
internal static class LinqPadExtension {
public static string TextDump(this T obj) {
if (obj is IEnumerable) return (obj as IEnumerable).Cast