import java.util.*;
class Main{
static int cnt=0,len=0;
static int index;
static int N=65;
static boolean[] vis=new boolean[N];
static int[] sticks =new int[N];
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
while(n!=0){
index=0;
int maxLen=0,sum=0;
for(int i=0;i<n;i++){
int val=sc.nextInt();
if(val>50) continue;
sticks[index]=val;
sum+=sticks[index];
maxLen=Math.max(maxLen,sticks[index]);
index++;
}
Arrays.sort(sticks, 0, index);
reverse(sticks,0,index-1);
for(len=maxLen;len<=sum;len++){
if(sum%len!=0) continue;
cnt=sum/len;
Arrays.fill(vis,false);
if(dfs(1,0,0)){
System.out.println(len);
break;
}
}
n=sc.nextInt();
}
}
public static boolean dfs(int num,int curLen,int start){
if(num>cnt) return true;
if(curLen==len) return dfs(num+1,0,0);
for(int i=start;i<index;i++){
if(!vis[i]&&curLen+sticks[i]<=len){
vis[i]=true;
if(dfs(num,curLen+sticks[i],i+1))
return true;
vis[i]=false;
//以下为剪枝内容。否则会TLE
//1.若sticks[i]放在其他地方会失败,那么其作为第一段或者最后一段也会失败
if(curLen==0||curLen+sticks[i]==len) return false;
//2.若存在相同长度的段,其一失败,另外的也肯定失败,无需再拼接
int j=i;
while(j<index&&sticks[j]==sticks[i]) j++;
i=j-1;
}
}
return false;
}
public static void reverse(int[] sticks,int s,int e){
while(s<=e){
int tmp=sticks[s];
sticks[s]=sticks[e];
sticks[e]=tmp;
s++;
e--;
}
}
}