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: Accepted)

#include<math.h>
#define min(x,y)((x)<(y)?(x):(y))
n,r[12];double d[12][12],smemo[1<<12][12];double shortest(restbits,last){int i;double s,t;if(restbits==0)return r[last];if(smemo[restbits][last])return smemo[restbits][last];s=1e3;for(i=0;i<n;i++){if(restbits&(1<<i)){t=d[last][i]+shortest(restbits-(1<<i),i);s=min(s,t);}}return smemo[restbits][last]=s;}main(){int L,i,j;char c;double s,t;for(;~scanf("%d",&L);){for(n=0;scanf("%d%c",r+n++,&c),c!='\n';);for(i=0;i<n;i++)for(j=0;j<n;j++)d[i][j]=2*sqrt(r[i]*r[j]);memset(smemo,0,sizeof(smemo));s=1e3;for(i=0;i<n;i++){t=r[i]+shortest((1<<n)-1-(1<<i),i);s=min(s,t);}puts(s<=L?"OK":"NA");}}