#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#define RG register
using namespace std;
int n,tail=0,num=0,maxx=-999999,sum=0,length,flag,minn=9999999;
int bj[300000],stick[300000];
inline int read()
{
int s=0,k=1;
char ch=getchar();
while(ch<'0'||ch>'9'&&ch!='-') ch=getchar();
if(ch=='-') k=-1,ch=getchar();
while(ch>='0'&&ch<='9') s=s*10+(ch-'0'),ch=getchar();
return s*k;
}
inline int comp(int a,int b)
{
return a>b;
}
inline void dfs(int current,int depth,int get_now)
{
if(depth==length) {current++;get_now=0;depth=0;}//当前找到一根木棍
if(current==num) {flag=1;return;}//答案符合要求
for(int i=get_now+1;i<=tail;i++)
{
if(!bj[i]) continue;
if(depth+stick[i]>length) continue;
if(stick[i]==stick[i-1]&&bj[i-1]==1) continue;//当前木棍与上一根长度相等,上一根不选,这一根也不选
bj[i]=false;
dfs(current,depth+stick[i],i);
if(flag) return;
bj[i]=true;
if(depth==0) return;//靠前面的木棍不能匹配成功,则后面也不能,答案不符合要求
}
}
int main()
{
memset(bj,true,sizeof(bj));
n=read();
for(RG int i=1;i<=n;i++)
{
RG int zz=read();
if(zz<=50) stick[++tail]=zz,maxx=max(maxx,zz),sum+=zz;
}
sort(stick+1,stick+tail+1,comp);//排序方便剪枝
for(RG int i=maxx;i<=sum;i++)
{
if(sum%i==0)
{
flag=0;
num=sum/i;
length=i;
dfs(0,0,0);
}
if(flag) {printf("%d\n",i);return 0;}
}
}
10-19
1286
09-14