Problem:
ビーカー

いろいろな容量のビーカーが与えられています。はじめに、その中の一番容量の大きなビーカーを一個選び、蛇口から水をいっぱいになるまで注ぎます。つぎに、次のルールにしたがいながら、ビーカーの水を他のビーカーに移し替えていきます。

ビーカーに入っている水は,残さずにすべて他のビーカーに移さなければならない。ただし、一個のビーカーに水を全部移せないときは、複数のビーカーに分けて移してもよい。

ビーカーに水を入れるとき、いっぱいになるまで水を注がなければならない。また、水をこぼしてはならない。

複数のビーカーから同じビーカーに一度に水を注いではならない。

同じビーカーには一度しか水を注いではならない。

このルールにしたがったとき、ビーカーの個数 n と各ビーカーの容量を入力とし、すべてのビーカーに水を注ぐことができるかどうかを判定して出力するプログラムを作成してください。すべてのビーカーに水を注ぐことができるときは YES (半角英大文字)、できないときは NO (半角英大文字) を出力してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。各データセットは以下の形式で与えられます。

n
c1 c2 ... cn

1 行目にビーカーの個数 n (1 ≤ n ≤ 50) が与えられます。２行目に i 番目のビーカーの容量を表す整数 ci (1 ≤ ci ≤ 100) が与えられます。

データセットの数は 105 を超えません。

Output

データセット毎に判定結果を１行に出力します。

Sample Input

10
11 2 23 4 2 12 8 5 2 10
8
2 1 3 11 2 3 1 4
9
5 9 1 2 4 8 17 1 8
8
3 38 9 4 18 14 19 5
1
1
0

Output for the Sample Input

YES
YES
YES
NO
YES

Solution in C++ (judge verdict: Wrong Answer)

#include<iostream>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define ALL(C)     (C).begin(),(C).end()

typedef long long ll;

int dp[100][101];
bool isbottom[101];

void calc(vector<int> in){
  rep(i,100)rep(j,101)dp[i][j]=0;
  dp[0][in[0]]=1;
  REP(i,1,in.size()){
    rep(j,101){
      dp[i][j]=dp[i-1][j];
      if (j-in[i]<0)continue;
      dp[i][j]+=dp[i-1][j-in[i]];
    }
  }

  rep(i,101)isbottom[i]=false;
  rep(i,in.size())if (dp[i][in[i]]==0)isbottom[in[i]]=true;
}

bool bt(int n,int now,int *inp,int *vol);

set<ll> D[100];
bool distribute(int n,int now,int *inp,int *vol){
  if (vol[now] == 0)return bt(n,now+1,inp,vol);

  ll state = 0;
  REP(i,now,n){
    state=(state<<1);
    if (vol[i] == inp[i])state++;
  }
  
  if (D[now].find(state) != D[now].end())return false;
  D[now].insert(state);
  if (vol[now] == 0)return false;



  REP(i,now+1,n){
    if (vol[i] != 0)continue;
    if (vol[now]-inp[i] < 0)continue;
    if (i-1 >= now+1 && inp[i-1] == inp[i] && vol[i-1] == 0)continue;
    vol[now]-=inp[i];
    vol[i]=inp[i];
    if (distribute(n,now,inp,vol))return true;
    vol[i]=0;
    vol[now]+=inp[i];
  }
  return false;
}

set<ll> S[100];
bool bt(int n,int now,int *inp,int *vol){
  if (now == n){
    return true;
  }

  ll state = 0;
  REP(i,now,n){
    state=(state<<1);
    if (vol[i] == inp[i])state++;
  }
  
  if (S[now].find(state) != S[now].end())return false;
  S[now].insert(state);
  if (vol[now] == 0)return false;

  //through
  if (bt(n,now+1,inp,vol))return true;

  if (isbottom[inp[now]]){
    return false;
  }
  //distribute
  if (distribute(n,now,inp,vol))return true;
  return false;
}

main(){
  int n;
  while(cin>>n && n){
    int in[n];
    int vol[n];
    vector<int> a;
    rep(i,n){
      cin>>in[i];vol[i]=0;a.push_back(in[i]);
      S[i].clear();
      D[i].clear();
    }
    sort(in,in+n,greater<int>());
    sort(ALL(a));
    vol[0]=in[0];
    calc(a);
    if (bt(n,0,in,vol) == true)puts("YES");
    else puts("NO");

    //rep(i,n)cout << in[i] <<" set size: "<<S[i].size() << endl;
    
  }
  return false;
}