/*dfs,剪枝是关键。╮(╯▽╰)╭本来是想一根棍子
一个棍子的填充,遇到棍子不合适的就回溯。但是实验
证明这绝对是剪错方向的!正确的解法是。。。先寻找
第一根棍子合不合适,如果不合适就没有必要找下去了,
这是关键点。这题堪称剪枝之最啊~~~~~
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
#define M 100
typedef long long LL;
int N,a[M],mark,vis[M],m;
bool dfs(int num,int re,int dul) //当dul等于0,就是重新找棍子的开始
{
    if(num==1) return true;
    int p;
    for(int i=0; i<N; ++i)
    {
        if(!vis[i])
        {
            if((p=re+a[i])<mark) //拼凑棍子
            {
                vis[i]=1;
                if(dfs(num,p,i+1)) return true;
                vis[i]=0;
                if(dul==0) break; //如果这个棍子找不到,就没有必要找下去了
            }
            else if(p==mark) //拼凑成功
            {
                vis[i]=1;
                if(dfs(num-1,0,0)) return true;
                vis[i]=0;
                break; //如果找不到这根新的棍子就没有必要继续下去了。
            }
        }
    }
    return false;
}
bool cmp(int m,int n)
{
    return m>n;
}
int main()
{
//freopen("abc.txt","r",stdin);
    while(~scanf("%d",&N)&&N)
    {
        int sum=0;
        for(int i=0; i<N; ++i)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        sort(a,a+N,cmp);
        int mmd=a[0];
        while(1)
        {
            while(sum%mmd!=0) //寻找可以被sum整除的数
                mmd++;
            memset(vis,0,sizeof(vis));
            mark=mmd;
            if(dfs(sum/mmd,0,0)) break;
            mmd++;
        }
        printf("%d\n",mmd);
    }
}