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: Wrong Answer)

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

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

double len;
double cake[12], dist[12][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){
        return (dp[bit][now]);
    }
    
    if (bit == (1 << n) - 1 && now == 0){
        return (dp[bit][now] = 0);
    }
    
    res = INF;
    for (i = 0; i < n; i++){
        if (!(bit >> i & 1)){
            res = min(res, tsp(bit | 1 << i, i) + dist[now][i]);
        }
    }
    
    return (dp[bit][now] = res);
}

int main(void)
{
    int i, j;
    
    while (scanf("%lf", &len) != EOF){
        getchar();
        n = 0;
        while (1){
            scanf("%lf", &cake[n++]);
            
            if (getchar() == '\n'){
                break;
            }
        }
        
        for (i = 0; i < (1 << 12); i++){
            for (j = 0; j < 12; j++){
                dp[i][j] = -1 * INF;
            }
        }
        
        for (i = 0; i < n; i++){
            for (j = 0; j < n; j++){
                dist[i][j] = sqrt(SQ(cake[i] + cake[j]) - SQ(cake[i] - cake[j]));
            }
            dist[i][i] = 0;
        }
        
        if (tsp(0, 0) <= len){
            printf("OK\n");
        }
        else {
            printf("NA\n");
        }
    }
    
    return (0);
}