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 C (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <math.h>
#include <string.h>

int ok;
int r[16] = {0};
int visit[16] = {0};
int md, N;

static inline int sq(int n) { return (n * n); }
void dfs(double d, int prev, int n)
{
	int i;
	if (n == 0){
		if (d + prev <= md) ok = 1;
		//printf("%f\n", d + prev);
		return;
	}
	for (i = 0; i < N; ++i){
		if (visit[i]) continue;
		visit[i] = 1;
		dfs(d + sqrt(sq(prev + r[i]) - sq(prev - r[i])), r[i], n - 1);
		visit[i] = 0;
		if (ok) return;
	}
}

int main(void)
{
	int i;
	char buf[1024];
	char *p;

	while (fgets(buf, sizeof(buf), stdin)){
		md = atoi(buf);
		p = buf;
		N = 0;
		while (p = strchr(p, ' ')){
			p++;
			r[N] = atoi(p);
			N++;
		}
		ok = 0;
		for (i = 0; i < N; ++i){
			visit[i] = 1;
			dfs(r[i], r[i], N - 1);
			visit[i] = 0;
			if (ok) {
				puts("OK");
				break;
			}
		}
		if (!ok) puts("NA");
	}
	return (0);
}