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

#define SQ(x) ((x) * (x))
#define INF (100000000)
#define EPS (1e-9)

int len, cake[12];
double dp[1 << 12][12];
int n;

double min(double a, double b)
{
    return (b > a ? a : b);
}

double tsp(int bit, int now)
{
    int i;
    double res;
    
    if (dp[bit][now] >= 0 && now >= 0){
        return (dp[bit][now]);
    }
    
    if (bit == (1 << n) - 1){
        return (cake[now]);
    }
    
    res = INF;
    for (i = 0; i < n; i++){
        if (!(bit >> i & 1)){
            res = min(res, tsp(bit | 1 << i, i) + (now >= 0 ? sqrt(SQ(cake[i] + cake[now]) - SQ(cake[i] - cake[now])) : cake[i]));
        }
    }
    
    return (now >= 0 ? dp[bit][now] = res : res);
}

int main(void)
{
    int i, j;
    char str[512];
    int flag;
    
    while (fgets(str, 512, stdin) != NULL){
        i = flag = len = n = 0;
        memset(cake, 0, sizeof(cake));
        while (str[i] != '\0'){
            if (flag == 0){
                while (str[i] != ' ' && str[i] != '\n'){
                    len = len * 10 + str[i++] - '0';
                }
                i++;
                flag = 1;
            }
            else {
                while (str[i] != ' ' && str[i] != '\n'){
                    cake[n] = cake[n] * 10 + str[i++] - '0';
                }
                n++;
                i++;
            }
        }
        
        for (i = 0; i < (1 << 12); i++){
            for (j = 0; j < 12; j++){
                dp[i][j] = -1 * INF;
            }
        }
        
        if (tsp(0, -1) < len + EPS){
            printf("OK\n");
        }
        else {
            printf("NA\n");
        }
    }
    
    return (0);
}