算法分析详见《算法进阶指南》
//毒瘤 最后一个点 用优化的cin过了 scanf没过,
#include <bits/stdc++.h>
using namespace std;
const int N=100;
int n,cnt,a[N],v[N],sum,len,val;
bool cmp(int a,int b){
return a>b;
}
bool dfs(int stick,int cab,int last){
//stick当前拼的第stick木棍
//cab当前木棍拼好的长度
//已经试到了第last根小木棍
if(stick>cnt){
return 1;//找到合适的拼凑方案
}
if(cab==len)return dfs(stick+1,0,1);//一定要return
int fail=0;//记录失败的木棍长度
for(int i=last;i<=n;i++){
if(!v[i]&&cab+a[i]<=len&&fail!=a[i]){
v[i]=1;
if(dfs(stick,cab+a[i],i+1))return 1;
//失败后回溯,包括标记回溯,当前木棍长度记录
v[i]=0;
fail=a[i];//失败的相同长度的木棍不用考虑了
if(cab==0||cab+a[i]==len)return 0; //当前是一根新木棍或者当前刚好可以凑成一根完整木棍都失败就是当前分支失败了
// int j=i;
// while(j<=n&&a[j]==a[i])j++;
// i=j-1;
}
}
return 0;
}
int main(){
ios::sync_with_stdio(false);
while(cin>>n&&n){
sum=0,val=0; //val要初始化
// memset(v,0,sizeof v);
for(int i=1;i<=n;i++){
//scanf("%d",&a[i]);
// if(a[i]>50){
// i--;
// n--;
// continue;
// }
cin>>a[i];
sum+=a[i];
val=max(a[i],val);
}
sort(a+1,a+n+1,cmp);//先用长木棍
//reverse(a+1,a+n+1);
for(len=val;len<=sum;len++){//从当前最长的短木棍试起
if(sum%len)continue;//如果无法整除len++
cnt=sum/len;
memset(v,0,sizeof v);
if(dfs(1,0,1))break;
}
cout<<len<<endl;
// printf("%d\n",len);
}
return 0;
}