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

fn main(){
   let eps: f64 = 0.000000001;
   
   loop {
     let mut buf = String::new();
     if let Ok(c) = std::io::stdin().read_line(&mut buf) {
       
       if c < 2 { break; }
       
       let wr: Vec<usize> = buf.split_whitespace().map(|e| e.parse().unwrap()).collect();
       let w = wr[0] as f64;
       let l: usize = wr.len() - 1;
       let rv: Vec<f64> = (1 .. l+1).map(|i| wr[i] as f64).collect();
       
       let mut dp: Vec<Vec<f64>> = vec![vec![2000.0; l]; 1 << l];

       for i in 0 .. l {
         dp[1 << i][i] = rv[i];
       }

       for s in 1 .. (1 << l) {
         for i in 0 .. l {
           if s & (1 << i) > 0 {
             for j in 0 .. l {
               if s & (1 << j) == 0 {
                 let nw = dp[s][i] + dist(rv[i], rv[j]);
                 dp[s | (1 << j)][j] = if nw < dp[s | (1 << j)][j] { nw } else {dp[s | (1 << j)][j]};
               }
             }
           }
         }
       }
       
       for i in 0 .. l {
           dp[(1<<l)-1][i] += rv[i];
       }

       let mut mnl: f64 = dp[(1<<l)-1][0];
       
       for i in 1 .. l {
           if mnl > dp[(1<<l)-1][i] {
              mnl = dp[(1<<l)-1][i];
           }
       }
       
       println!("{}", if (w - mnl).abs() < eps || w > mnl {"OK"} else {"NA"});
     }
   }
}

fn dist(r1: f64, r2: f64) -> f64 {
   2.0 * (r1 * r2).sqrt()
}