scanf,c++98加上o2,桶排序
#include<bits/stdc++.h>
using namespace std;
int n,a[70],b[70],cnt,maxx=-1,m;
bool flag=false,vis[70];
void dfs(int sum,int len,int now)
{
if(flag) return ;
if(len==m)
{
if(sum==n)
{
flag=true;
return ;
}
else len=0,now=1;
}
if(len==0)
{
int k=1;
while(vis[k]) k++;
vis[k]=1;//选
dfs(sum+1,len+a[k],k+1);
vis[k]=0;//不选
return ;
}
for(int i=now;i<=n;++i)
{
if(vis[i]==0&&len+a[i]<=m)
{
if(a[i]==a[i-1]&&!vis[i-1]) continue;
vis[i]=1;
dfs(sum+1,len+a[i],i+1);
if(flag) return ;
vis[i]=0;
if(len+a[i]==m) break;
}
}
}
int main()
{
// freopen("input.in","r",stdin);
// freopen("output.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
cnt+=a[i],maxx=max(a[i],maxx);
b[a[i]]++;
}
for(int i=maxx,j=0;j<n;i--)
{
while(b[i]) a[++j]=i,b[i]--;
}
for(int i=maxx;i<=cnt;i++)
{
if(cnt%i==0)
{
memset(vis,0,sizeof(vis));
m=i;
dfs(0,0,1);
if(flag) printf("%d",i),exit(0);
}
}
return 0;
}