#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
using namespace std;

template <class T> inline void checkmin(T &x,T t){if (t<x) x=t;}
template <class T> inline void checkmax(T &x,T t){if (t>x) x=t;}

class RedIsGood {
public:
	double getProfit(int, int);
};
const int N=5005;
double F[2][N];

double RedIsGood::getProfit(int R, int B) {
	memset(F,0,sizeof(F));
	for (int i=0;i<=R;i++){
		int p=i&1;
		for (int j=0;j<=B;j++)
			if (i+j){
				if (j==0) F[p][j]=F[p^1][j]+1;
				else if (i) checkmax( F[p][j] , (F[p^1][j]+1)*(1.0*i/(i+j)) + (F[p][j-1]-1)*(1.0*j/(i+j)) );
			}
		memset(F[p^1],0,sizeof(F[p^1]));
	}
	return F[R&1][B];
}
