Problem:
パティシエ

ケーキ屋さんが、まちまちな大きさのロールケーキをたくさん作りました。あなたは、このケーキを箱に並べる仕事を任されました。

ロールケーキはとてもやわらかいので、他のロールケーキが上に乗るとつぶれてしまいます。ですから、図(a) のように全てのロールケーキは必ず箱の底面に接しているように並べなければなりません。並べ替えると必要な幅も変わります。

図(a)

図(b)

n 個のロールケーキの半径 r1, r2, ..., rn と箱の長さを読み込み、それぞれについて、箱の中にうまく収まるかどうか判定し、並べる順番を工夫すると箱に入る場合は "OK"、どう並べても入らない場合には "NA"を出力するプログラムを作成してください。

ロールケーキの断面は円であり、箱の壁の高さは十分に高いものとします。 ただし、ロールケーキの半径は 3 以上 10 以下の整数とします。つまり、ケーキの半径に極端な差はなく、図(b) のように大きなケーキの間に小さなケーキがはまり込んでしまうことはありません。

Input

入力は複数のデータセットからなります。各データセットは以下の形式で与えられます。

W r1 r2 ... rn

最初に箱の長さを表す整数 W (1 ≤ W ≤ 1,000) が与えられます。 続いて、空白区切りで各ロールケーキの半径を表す整数 ri (3 ≤ ri ≤ 10) が与えられます。ケーキの個数 n は 12 以下です。

データセットの数は 50 を超えません。

Output

データセットごとに OK または NA を１行に出力してください。

Sample Input

30 4 5 6
30 5 5 5
50 3 3 3 10 10
49 3 3 3 10 10

Output for the Sample Input

OK
OK
OK
NA

Solution in JAVA (judge verdict: Accepted)

import java.util.Scanner;

public class Main {
	static double dp[][][];
	static int n, a;
	static double r[];

	public static double f(int left, int right, int bit) {
		if (0 < dp[left][right][bit]) {
			return dp[left][right][bit];
		}
		int k = check(bit);
		if (k == 1) {
			return dp[left][right][bit] = 2.0 * r[left];
		}
		if (k == 2) {
			return dp[left][right][bit] = r[left] + r[right] + 2.0 * Math.sqrt(r[left] * r[right]);
		}

		double min = Double.MAX_VALUE;
		for (int i = 0; i < n; i++) {
			if (i == left || i == right || (bit & (1 << i)) == 0) {
				continue;
			}
			for (int j = 0; j < n; j++) {
				if (j == left || j == right || (bit & (1 << j)) == 0) {
					continue;
				}
				if (3 < k && i == j) {
					continue;
				}
				double sub = f(i, j, (bit ^ (1 << left)) ^ (1 << right));
				sub -= r[i] + r[j];
				sub += 2.0 * (Math.sqrt(r[left] * r[i]) + Math.sqrt(r[right] * r[j]));
				sub += r[left] + r[right];
				min = Math.min(min, sub);
			}
		}
		return dp[left][right][bit] = min;
	}

	public static int check(int bit) {
		int count = 0;

		for (int i = 0; i < 12; i++) {
			if (0 < (bit & (1 << i))) {
				count++;
			}
		}
		return count;
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		while (sc.hasNext()) {
			String b[] = sc.nextLine().split(" ");
			a = Integer.parseInt(b[0]);
			n = b.length - 1;
			r = new double[n];
			dp = new double[n][n][1 << n];
			for (int i = 0; i < n; i++) {
				r[i] = Integer.parseInt(b[i + 1]);
			}
			double min = Double.MAX_VALUE;
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < n; j++) {
					if (n == 1 || i != j) {
						min = Math.min(min, f(i, j, (1 << n) - 1));
					}
				}
			}
			System.out.println(min <= a ? "OK" : "NA");
		}
	}
}