//已经删掉了剪枝,如果要AC还要继续剪枝,思路大家可以自己思考一下
//本题主要使用的思想是DFS的第三种类型,还原现场,DFS三种类型详情可参阅本人博客POJ1015那篇
#include<iostream>
#include<cstring>
#include<stdlib.h>
using namespace std;
int n;
int maxx;
int minx;
int d[65];
bool v[65];
int cmp(const void *a,const void *b){
return *(int*)b-*(int*)a;
}
bool dfs(int sum,int start,int already){
if(already==sum){
bool flag=true;
int s;
for(int i=1;i<=n;i++){
if(v[i]!=true){
flag=false;
s=i;
break;
}
}
if(flag==true){
return true;
}
else{
v[s]=true;
if(dfs(sum,s,d[s])){
return true;
}
else{
v[s]=false;
return false;
}
}
}
for(int i=start+1;i<=n;i++){
if(v[i]==false&&already+d[i]<=sum){
v[i]=true;
if(dfs(sum,i,already+d[i])==true){
return true;
}
v[i]=false;
}
}
return false;
}
int main(){
cin>>n;
d[0]=100000;
int sumOfAll;
while(n!=0){
minx=100;
maxx=-100;
sumOfAll=0;
for(int i=1;i<=n;i++){
cin>>d[i];
sumOfAll+=d[i];
if(d[i]>maxx){
maxx=d[i];
}
if(d[i]<minx){
minx=d[i];
}
v[i]=false;
}
qsort(d,n+1,sizeof(int),cmp);
v[1]=true;
for(int i=maxx;i<=50;i+=minx){
if(sumOfAll%i==0)
if(dfs(i,1,d[1])==true){
cout<<i<<endl;
break;
}
}
cin>>n;
}
return 0;
}