Iahub and Iahubina went to a picnic in a forest full of trees. Less than 5 minutes passed before Iahub remembered of trees from programming. Moreover, he invented a new problem and Iahubina has to solve it, otherwise Iahub won't give her the food. 

Iahub asks Iahubina: can you build a rooted tree, such that

  * each internal node (a node with at least one son) has at least two sons; 
  * node i has ci nodes in its subtree? 



Iahubina has to guess the tree. Being a smart girl, she realized that it's possible no tree can follow Iahub's restrictions. In this way, Iahub will eat all the food. You need to help Iahubina: determine if there's at least one tree following Iahub's restrictions. The required tree must contain n nodes.

Input

The first line of the input contains integer n (1 ≤ n ≤ 24). Next line contains n positive integers: the i-th number represents ci (1 ≤ ci ≤ n).

Output

Output on the first line "YES" (without quotes) if there exist at least one tree following Iahub's restrictions, otherwise output "NO" (without quotes). 

Examples

Input

4
1 1 1 4


Output

YES

Input

5
1 1 5 2 1


Output

NO
import java.io.*;
import java.util.*;

public class Main {
	static int mod = (int)1e9+7;
	static int N = 50;
    int n;
    int[] a = new int[N], b= new int[N], c = new int[N];
    boolean dfs(int k){
        if (k == 0) {
            for (int i = 1; i <= n; ++i) 
            	if (b[i] != a[i] - 1) return false;
            return true;
        }
        for (int i = n; i > k; --i)
            if (a[i] - 1 > a[k] && a[k] + b[i] < a[i]) {
                b[i] += a[k];
                if (dfs(k - 1)) return true;
                b[i] -= a[k];
            }
        return false;
    }
    void work() throws Exception {
    	in = new BufferedReader(new InputStreamReader(System.in));
    	out = new PrintWriter(System.out);
    	
    	n = nextInt();
    	for(int i = 1; i <= n; i ++) {
    		a[i] = nextInt();
    	}
    	Arrays.sort(a, 1, n+1);
    	if (n == 1) {
            if (a[1] == 1) out.println("YES");
            else out.println("NO");
        } else{
            for (int i = 1; i <= n; ++i) if (a[i] == 2) {
            	out.println("NO");
            	return;
            }
            if (a[n] == n && dfs(n - 1))  out.println("YES");
            else out.println("NO");
        }
    }
    BufferedReader in;
    StringTokenizer str = null;
    static PrintWriter out;
    private String next() throws Exception{
    	while (str == null || !str.hasMoreElements())
    	    str = new StringTokenizer(in.readLine());
    	return str.nextToken();
    } 
    private int nextInt() throws Exception{
    	return Integer.parseInt(next());
    }
    private long nextLong() throws Exception{
    	return Long.parseLong(next());
    }
    static int dx[] = {0,1,0,-1};
    static int dy[] = {1,0,-1,0};
    class pair implements Comparable<pair>{
    	int first, second;
    	pair(int x, int y) {
    		first = x;
    		second = y;
    	}
		public int compareTo(pair o) {
			// TODO Auto-generated method stub
			if(first != o.first) return ((Integer)first).compareTo(o.first);
			else return ((Integer)second).compareTo(o.second); 
		}
    }
    public static void main(String[] args) throws Exception{
        Main wo = new Main();
        wo.work();
        out.close();
    }
}
 									 	 			  	 	   		 	 		