#include<bits/stdc++.h>
using namespace std;
int n,a[105],v[105]={0};//v[]表示该条是否拼过
int len,sum=0,m;//len为每段长度 ,m为能拼成的根数
bool cmp(int x,int y){
return x>y;
}
bool dfs(int k,int now,int d){//k为已完成根数,now为当前编号,为当前木条所完成的 长度
if(k==m){return true;} //目标完成
if(d==len){//已经完成一个,开启下一个
for(int i=1;i<=n;i++){
if(!v[i]) {
v[i]=1;
return dfs(k+1,i,a[i]);
break;
}
}
}
for(int i=now+1;i<=n;i++){
if(!v[i]&&d+a[i]<=len){//这根可用
v[i]=1;//标记用过
if(!dfs(k,i,d+a[i])){
v[i]=0;//回溯
int j=i;
while(a[j]==a[i]&&i<n) i++;//相同直接跳过
}
}
}
if(now==n&&d<len){return false;}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
sort(a+1,a+n+1,cmp);
len=a[1];
for(len;len<=sum/2;len++){
if(sum%len==0){
memset(v,0,sizeof(v));
m=sum/len;
v[1]=1;
if(dfs(0,1,a[1])) {
cout<<len;
return 0;
}
}
}
cout<<sum;
return 0;
}
/*
60
5 6 6 5 2 8 7 8 2 5 8 6 3 1 4 8 6 5 5 7 2 4 3 3 1 1 5 4 5 1 1 1 8 4 3 3 5 3 8 1 2 8 7 2 2 8 4 4 5 2 4 8 6 4 8 2 8 1 1 1
10
WA
*/
60
5 6 6 5 2 8 7 8 2 5 8 6 3 1 4 8 6 5 5 7 2 4 3 3 1 1 5 4 5 1 1 1 8 4 3 3 5 3 8 1 2 8 7 2 2 8 4 4 5 2 4 8 6 4 8 2 8 1 1 1
10
WA
大概是return的问题