不能相信一本通!!!!!!!!!!!!!!!!!!!!!
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return f*x;
}
int n,a[100],p,a1,sum,len,m;
bool f[100],ans;
bool cmp(int a,int b)
{
return a>b;
}
void dfs(int k,int last,int rest)
{
if(!rest)
{
if(k==m)
{
ans=1;
return;
}
for(int i=1;i<=n;i++)
if(!f[i])
{
f[i]=1;
dfs(k+1,i,len-a[i]);
f[i]=0;
if(ans) return;
break;
}
}
for(int i=last+1;i<=n;i++)
if(!f[i]&&a[i]<=rest)
{
f[i]=1;
dfs(k,i,rest-a[i]);
f[i]=0;
if(ans) return;
if(rest==a[i]||rest==len) return;
int l=i;
while(i<n&&a[i+1]==a[l]) i++;
if(i==n) return;
}
}
int main()
{
p=read();
for(int i=1;i<=p;i++)
{
a1=read();
if(a1<=50)
{
a[++n]=a1;
sum+=a1;
}
}
sort(a+1,a+n+1,cmp);
for(len=a[1];len<=sum;len++)
if(sum%len==0)
{
f[1]=1;
m=sum/len;
dfs(1,1,len-a[1]);
if(ans)
{
cout<<len;
break;
}
}
return 0;
}