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 <string.h>
#include <math.h>

#define N_MAX 12
#define EPS (1e-7)

int width;
int n;
int r[N_MAX];

char visited[N_MAX][1<<N_MAX];

int judge(int prev,int used,double cur_width) {
	int i;
	if(cur_width>width+EPS)return 0;
	if(used==(1<<n)-1) {
		cur_width+=r[prev];
		return cur_width<width+EPS;
	}
	for(i=0;i<n;i++) {
		if((used&(1<<i))==0) {
			/* sqrt((r1+r2)^2 - (r1-r2)^2) */
			double delta=2.0*sqrt(r[prev]*r[i]);
			if(judge(i,used|(1<<i),cur_width+delta))return 1;
		}
	}
	return 0;
}

int main(void) {
	char input_buffer[1024];
	while(fgets(input_buffer,sizeof(input_buffer),stdin)!=NULL) {
		int cur_num=0;
		int cur_index=-1;
		int i;
		int ok=0;
		for(i=0;;i++) {
			if('0'<=input_buffer[i] && input_buffer[i]<='9') {
				cur_num=cur_num*10+input_buffer[i]-'0';
			} else {
				if(cur_num>0) {
					if(cur_index<0)width=cur_num; else r[cur_index]=cur_num;
					cur_index++;
				}
				cur_num=0;
				if(input_buffer[i]=='\0') {
					n=cur_index;
					break;
				}
			}
		}
		memset(visited,0,sizeof(visited));
		for(i=0;i<n;i++) {
			ok=ok || judge(i,1<<i,(double)r[i]);
		}
		puts(ok?"OK":"NA");
	}
	return 0;
}