题目传送门
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define ll long long
const int maxn = 70;
int L,sum,n;
int len[maxn];
int used[maxn];
int cmp(const void *a ,const void *b)
{
return *(int *)b - *(int *)a;
}
int getInt(int &x)
{
return scanf("%d",&x);
}
bool dfs(int m,int left)
{
if(m==0&&left==0) return true;
if(left==0)
{
left=L;
}
for(int i=0 ; i<n; i++)
{
if(!used[i]&&len[i]<=left)
{
if(i>0)
{
if(!used[i-1]&&len[i]==len[i-1])
continue;
}
used[i]=1;
if(dfs(m-1,left-len[i]))
{
return true;
}
else
{
used[i]=0;
if(left==len[i]||left==L)
return false;
}
}
}
return false;
}
int main()
{
while(getInt(n)&&n)
{
sum=0;
for(int i=0;i<n;i++)
{
getInt(len[i]);
sum+=len[i];
}
bool ok=false;
qsort(len,n,sizeof(len[0]),cmp);
for(L=len[0];L<=sum/2;L++)
{
if(sum%L)continue;
memset(used,0,sizeof(used));
if(dfs(n,L))
{
ok=true;
printf("%d\n",L);
break;
}
}
if(ok==false)
printf("%d\n",sum);
}
return 0;
}