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

#define MAX_LEN 256
#define MAX_NUM 12
#define MAX_SQRT 100

void init_map(int num);
void init_sqrt(void);

double getmin(int pat,int r,int ad,int num);
double getmin2(int pat,int ad,int num);
double getmin3(int num);

int cake[MAX_NUM]; /* P[LTCY */
double min; /* ÅKð */

double sq[MAX_SQRT+1];/* [gvZÊ */

double map[1<<MAX_NUM][MAX_NUM];

int main(){
	char buf[MAX_LEN];
	int num; /* P[LÂ */
	int width; /*  Ì·³ */
	int offset; /* obt@àùÇÊu */
	int oftmp;
	
	init_sqrt();
	
	while(fgets(buf,MAX_LEN,stdin)!=NULL){
		/* Âæ¾ */
		sscanf(buf,"%d%n",&width,&oftmp);
		offset = oftmp;
		/* TCYæ¾ */
		num = 0;
		while(sscanf(buf+offset,"%d%n",&cake[num],&oftmp) > 0){
			offset+=oftmp;
			num++;
		}
		
		/* èvZ */
		init_map(num);
		
		min = getmin3(num);
		printf("%d %.5f\n",width,min);
		printf(min<=width?"OK\n":"NG\n");
	}
	return 0;
}

void init_sqrt(void){
	int i;
	for(i=0;i<MAX_SQRT+1;i++){
		sq[i] = 2*sqrt(i);
	}
}

void init_map(int num){
	int i,j;
	for(i=0;i<(1<<num);i++){
		for(j=0;j<num;j++){
			map[i][j]=0;
		}
	}
	for(i=0;i<num;i++){
		map[1<<i][i] = 2*cake[i];
	}
}

double getmin(int pat,int r,int ad,int num){
	double min; /* ¡ñßéÅ¬lißèlj */
	double premin; /* patÆrÅÌÅ¬l */
	double premintmp;
	int i,bit;
	int prepat;/* pat©çrð²¢½p^[ */
	
	premin = map[pat][r];
	if(premin==0){
		premin = 99999;
		prepat = pat - (1<<r);
		for(i=0;i<num;i++){
			bit = 1<<i;
			if((bit&prepat)!=0){
				premintmp = getmin(prepat,i,r,num);
				if(premintmp<premin){
					premin=premintmp;
				}
			}
		}
		map[pat][r] = premin;
	}
	pat += (1<<ad);
	min = premin - cake[r] + sq[cake[r]*cake[ad]] + cake[ad];
	map[pat][ad] = min;
	return min;
}

double getmin2(int pat,int ad,int num){
	int i,bit;
	double min,ret;
	min = 99999;
	for(i=0;i<num;i++){
		bit = 1<<i;
		if((bit&pat)!=0){
			ret = getmin(pat,i,ad,num);
			if(ret<min)min=ret;
		}
	}
	return min;
}

double getmin3(int num){
	int i,bit,pat;
	double min,ret;
	min = 99999;
	pat = (1<<num)-1;
	for(i=0;i<num;i++){
		bit = 1<<i;
		ret = getmin2(pat-bit,i,num);
		if(ret<min)min=ret;
	}
	return min;
}