import java.util.*;

public class IntegerSubsetIterator implements Iterator<ArrayList<Integer>>{

	private int current = 0;
	private int numBits;
	private int size;
	
	public static void main(String args[]){
		ArrayList<Double> blocks = new ArrayList<Double>();
		
		for( int i = 1; i <= 23; i++ ){
			//blocks.add(Math.sqrt(i));
			blocks.add(new Double(i));
		}
		
		System.out.println(twoTowersSolver(blocks));
	}
	
	public static double twoTowersSolver(ArrayList<Double> blockSizes){
		double target = (double)sum(blockSizes)/2;
	
		IntegerSubsetIterator it = new IntegerSubsetIterator(blockSizes.size());
		
		double bestDiff = Integer.MAX_VALUE;
		
		while(it.hasNext()){
			ArrayList<Integer> set = it.next();
			
			int height = 0;
			
			for( Integer i: set ){
				height += blockSizes.get(i);
			}
			
			double diff = Math.abs(height - target);
			
			if( diff < bestDiff ){
				bestDiff = diff;
			}
		}
		
		return bestDiff;
	}
	
	private static double sum(ArrayList<Double> nums){
		double sum = 0;
		
		for(Double i: nums){
			sum += i;
		}
		
		return sum;
	}
	
	public IntegerSubsetIterator(int size){
		numBits = size;
		this.size = (int)Math.pow(2, size);
	}
	
	public boolean hasNext() {
		return current < size;
	}

	public ArrayList<Integer> next() {
		ArrayList<Integer> set = new ArrayList<Integer>();
		
		for( int i = 0; i < numBits; i++ ){
			if( ((current >> i) & 1) == 1 ){
				set.add(i);
			}
		}
		
		current++;
		return set;
	}

	public void remove() {
		// won't do
	}

}
