蒟蒻的自我拯救。。。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define maxn 100
int len[maxn],n,num,sum;
bool vis[maxn];
bool dfs(int length,int l,int count,int pos)
{
if(length==sum)
return 1;
if(count==num)
return 1;
for(int i=pos;i<=n;i++)
{
if(vis[i]) continue;
if(l+len[i]==length)
{
vis[i]=1;
if(dfs(length,0,count+1,1))
return 1;
vis[i]=0;
return 0;
}
if(l+len[i]<length)
{
vis[i]=1;
if(dfs(length,l+len[i],count,i+1))
return 1;
vis[i]=0;
if(l==0) return 0;
while(len[i]==len[i+1]) i++;
}
}
return false;
}
int main()
{
while(scanf("%d",&n))
{
if(n==0)
break;
sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&len[i]);
sum+=len[i];
}
sort(len+1,len+1+n);
for(int i=len[1];i<=sum;i++)
{
if(sum%i) continue;
num=sum/i;
memset(vis,0,sizeof(vis));
if(dfs(i,0,0,1))
{
printf("%d\n",i);
break;
}
}
}
return 0;
}