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 JAVA (judge verdict: Accepted)

import java.io.*;
import java.util.*;
import java.awt.geom.*;

public class Main {
    double box_len;
    double rs[];
    BufferedReader br;
    double[][] dp;
    int n;

    Main() {
        br = new BufferedReader(new InputStreamReader(System.in));
    }

    boolean init() {
        try {
            String[] data = br.readLine().split(" ");
            box_len = Double.parseDouble(data[0]);
            rs = new double[data.length-1];
            n = rs.length;
            for (int i = 1; i < data.length; i++) 
                rs[i-1] = Double.parseDouble(data[i]);

            dp = new double[n][1<<n]; 

            return true;
        } catch (IOException e) {
            return false;
        } catch (NullPointerException e) {
            return false;
        }
    }

    double dist(double a, double b) {
        return Math.sqrt( (a+b)*(a+b) - (a-b)*(a-b) );
    }

    double solve(int v, int S) {
//        System.out.printf("%d %d\n", v, S);
        if (S == ((1<<n)-1)) return rs[v];
        if (dp[v][S] > 0) return dp[v][S];

        double minl = INF;
        for (int i = 0; i < n; i++) {
            if ((S & (1<<i)) != 0) continue;
            minl = Math.min(minl, solve(i, S + (1<<i)) + dist(rs[v], rs[i]));
        }

        return dp[v][S] = minl;
    }

    static final double INF = 1e18;
    void run() {
        while (init()) {
            double min_len = INF;

            for (int i = 0; i < n; i++) 
                min_len = Math.min(min_len, solve(i, (1<<i)) + rs[i]);

            if (box_len >= min_len) 
                System.out.println("OK");
            else
                System.out.println("NA");
        }
    }

    public static void main(String[] args) {
        new Main().run();
    }
}