#include<bits/stdc++.h>
using namespace std;
int n;
bool flag,vis[70];
int stick[70],nxt[70];
int cnt,sum,len,num;
inline int read(){
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
if(f) return x;
return 0-x;
}
inline bool cmp(int a,int b){
return a>b;
}
inline void dfs(int k,int last,int rest){
if(rest==0){
if(k==num){
flag=true;
return ;
}
int nex;
for(register int i=0;i<cnt;i++){
if(!vis[i]){
nex=i;
break;
}
}
vis[nex]=true;
dfs(k+1,nex,len-stick[nex]);
vis[nex]=false;
if(flag){
return ;
}
}
int l=last+1,r=cnt,mid;
while(l<r){
mid=(l+r)>>1;
if(stick[mid]<=rest)
r=mid;
else
l=mid+1;
}
for(register int i=0;i<cnt;i++){
if(!vis[i]){
vis[i]=true;
dfs(k,i,rest-stick[i]);
vis[i]=false;
if(flag) return ;
if(rest==stick[i]||rest==len) return;
i=nxt[i];
if(i==cnt) return ;
}
}
}
int main(){
n=read();
for(register int i=0;i<n;i++){
stick[cnt]=read();
if(stick[cnt]<=50){
sum+=stick[cnt];
cnt++;
}
}
sort(stick,stick+cnt,cmp);
nxt[cnt]=cnt;
for(register int i=cnt-1;i>0;i--){
if(stick[i]==stick[i+1]) nxt[i]=nxt[i+1];
else nxt[i]=i;
}
for(len=stick[0];len<=(sum/2);len++){
if(sum%len) continue;
num=sum/len;
vis[1]=true;
flag=false;
dfs(1,1,len-stick[1]);
vis[1]=false;
if(flag){
cout<<len<<endl;
return 0;
}
}
cout<<sum<<endl;
return 0;
}
实在优化不动了,蒟蒻求助