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 <bits/stdc++.h>
#define INF 1e9
using namespace std;

int getNum(string a,int &i){
  int res=0;
  while(isdigit(a[i]))res=res*10+a[i++]-'0';
  return res;
}

double getx(double R,double r){return sqrt((R+r)*(R+r)-(R-r)*(R-r));}


int n;
vector<double> num;
double mem[11][11][1<<12];
int used[11][11][1<<12];
double dfs(int l,int r,int sta){
  if(sta==(1<<n)-1)return 0;
  if(used[l][r][sta]++)return mem[l][r][sta];

  double res=INF;
  for(int i=0;i<n;i++){
    if((sta&(1<<i)))continue;
    double lcost=num[i]+getx(l,num[i])-l;
    double rcost=num[i]+getx(num[i],r)-r;
    res=min(res,lcost+dfs(num[i],r,sta|(1<<i)));
    res=min(res,rcost+dfs(l,num[i],sta|(1<<i)));
  }
  return mem[l][r][sta]=res;
}

int main(){
  string str;
  while(getline(cin,str)){
    int w,idx=0;
    w = getNum(str,idx);
    num.clear();
    while(idx++<str.size())num.push_back(getNum(str,idx));
    n = num.size();
    memset(used,0,sizeof(used));
    double mn=INF;
    for(int i=0;i<n;i++)mn=min(mn,2*num[i]+dfs(num[i],num[i],1<<i));
    cout<<(dfs(0,0,0)<=w? "OK":"NA")<<endl;
  }
  return 0;
}