protected int processPuzzle(int f,int e)
	{

		if(f==0||f==1)
			return f;
		if(e==1)
		{
			return f;
		}
		int attemptsReqdBrk,attemptsReqdDBrk,res;
		int min=Integer.MAX_VALUE;

		if(e>1)
		{
			for(int i=1;i<=f;i++)
			{
				// egg breaks
				if(!cache.containsKey(f+","+e))
				{
					attemptsReqdBrk=1+processPuzzle(i-1,e-1);
					cache.put(f+","+e,attemptsReqdBrk);
				}
				else
					attemptsReqdBrk=cache.get(f+","+e);
				// egg does not break
				if(!cache.containsKey(f+","+e))
				{
					attemptsReqdDBrk=1+processPuzzle(f-i,e);
					cache.put(f+","+e,attemptsReqdDBrk);
				}
				else
					attemptsReqdDBrk=cache.get(f+","+e);
				res=max(attemptsReqdBrk,attemptsReqdDBrk);
				if(res<min)
				{
					min=res;
				}
			}
		}
		return min;
	}