/*
题意:给出一堆小木棍,将这些木棍拼接成长度相等的若干条木棍,问可以拼接出来的最短的长度。
题解:DFS+剪枝
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int s[70];
int a,n,sum;
bool f[70];
bool cmp(int a, int b)
{
return a>b;
}
//ans记录当前拼了的木棍总长度,as表示当前拼接的那根木棍的长度,j表示从第j个棍开始搜索
bool dfs(int ans, int as, int j)
{
if (ans == sum)
return true;
for(int i=j; i<n; i++)
if (!f[i] && as+s[i]<=a)
{
if (as+s[i] == a)
{
f[i] = true;
if (dfs(ans+s[i],0, 0))
return true;
f[i] = false;
if (as == 0)//当as为0而前面的dfs没有返回true,说明当前的拼法是错误的,返回false
return false;
}
else
{
f[i] = true;
if (dfs(ans+s[i],as+s[i], i+1))
return true;
f[i] = false;
if (as == 0)
return false;
}
}
return false;
}
int main(void)
{
while (cin >> n && n)
{
sum = 0;//sum记录木棍总长度
for(int i=0; i<n; i++)
{
cin >> s[i];
sum += s[i];
}
sort(s,s+n,cmp);//从大到小排序
for(a=s[0]; a<=sum; a++)// 从最长的木棍开始
{
if (sum%a == 0)//因为是等长木棍,因此需要sum的约数才可能正确
{
memset(f,false,sizeof(f));
if (dfs(0,0,0))
{
cout << a << endl;
break;
}
}
}
}
return 0;
}