#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
bool visit[70000]; //标记是否用过
long long n,m,len,solve,ans=2147483647,a[70000]; //n:总数;m:切割前根数;len:切割前长度;solve:是否有解;ans:答案
long long down=-1,up; //下限,上限
bool cmp(int a,int b) {
return a>b;
}
void dfs(int k,int last,int rest) {
int t;
if(k==m) {
solve=true;
return ;
}
if(rest==0) {
for(int i=1;i<=n;i++) {
if(!visit[i]) {
visit[i]=1;
t=i;
break;
}
}
dfs(k+1,t,len-a[t]);
}
for(int i=last+1;i<=n;i++) {
if(!visit[i]&&rest>=a[i]) {
visit[i]=true;
dfs(k,i,rest-a[i]);
visit[i]=false;
}
//if(i==n) return ;
}
}
int main() {
ios::sync_with_stdio(false);
cin>>n;
int o=n;
memset(a,0,sizeof(a));
down=-1,up=0;
for(int i=1;i<=n;i++) {
cin>>a[i];
if(a[i]>50) o--,a[i]=0;
if(a[i]<=50) up+=a[i];
if(a[i]<=50) down=max(down,a[i]);
}
sort(a+1,a+n+1,cmp);
n=o;
//for(int i=1;i<=n;i++) cout<<a[i]<<' ';
//cout<<'\n';
//cout<<n<<' '<<up<<'\n';
for(int i=down;i<=up;i++) {
if(up%i==0) {
memset(visit,0,sizeof(visit));
len=i;
solve=0;
visit[1]=1;
m=up/i;
dfs(1,1,len-a[1]);
if(solve) ans=min(len,ans);
//cout<<solve<<' '<<len<<'\n';
}
}
cout<<ans<<'\n';
ans=2147483647;
return 0;
}
改了1h,从21pts→76pts,实在改不了了,有没有大佬能帮忙查一下错,谢谢。