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 <stdlib.h>
#include <string.h>
#include <math.h>
#define MIN(x,y) (x)>(y)?(y):(x)

int r[12],flag[12],roll[12];
double min;

int compare_int(const void *a, const void *b){
    return *(int*)a - *(int*)b;
}

double calc(int n){
	int i;
	double res = (r[roll[0]]+r[roll[n-1]])*1.0;
	
	for(i = 0;i < n-1;i++){
		res += sqrt(4.0*r[roll[i]]*r[roll[i+1]]);
	}
	
	return res;
}

void foo(int n,int N){
	int i;
	
	if(n == N){
		min = MIN(calc(n),min);
		return;
	}
	
	for(i = 0;i < N;i++){
		if(!flag[i]){
			if(roll[n] == -1){
				roll[n] = i;
				flag[i] = 1;
				foo(n+1,N);
				flag[i] = 0;
			}else{
				if(r[roll[n]] != r[i]){
					roll[n] = i;
					flag[i] = 1;
					foo(n+1,N);
					flag[i] = 0;
				}
			}
		}
	}
}

int main(void) {
	int box,i,n;
	char str[64],*p;
	
	while(fgets(str,64,stdin) != NULL){
		box = atoi(strtok(str," \r\n"));
		
		n = 0;
		while(p = strtok(NULL," \r\n"),p != NULL){
			r[n++] = atoi(p);
		}
		
		qsort(r,n,sizeof(int),compare_int);
		memset(flag,0,sizeof(flag));
		for(i = 0;i < n;i++){
			roll[i] = -1;
		}
		min = 120.0;
		foo(0,n);
		
		printf("%s\n",min <= box ? "OK" : "NA");
	}
	
	return 0;
}