#include<cstdio>
#include<cstring>
#include<cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
int stick[65],n,sum,num,l;
bool mark[65];//标记已经读取过的棍子
bool cmp( int a,int b)//sort的倒序函数
{
return a>b;
}
bool dfs(int s,int len,int pos)//s:成功组装的棍子;len:当前组成棍子的长度;pos:数组下标
{
int i;
bool sign=(len == 0?true:false);//标记,然后用来剪枝
if (s == num) return true;//终止条件
for ( i = pos+1; i < n; i++)
{
if (mark[i]) continue;//已经用过的棍子不再重复
// printf("%d\n",stick[i]);
if (stick[i]+len==l)
{
mark[i] = true;
if ( dfs(s+1,0,-1))//继续搜索下一步
return true;
mark[i] = false;
return false;
}
else if ( stick[i]+len<l) //若不够继续拿棍子
{
mark[i]= true;
// printf("\n%d\n\n",stick[i]);
if (dfs(s,len+stick[i],i))//增加棍子继续搜索
return true;
mark[i]=false;
if (sign) return false;
while (stick[i]==stick[i+1]) i++; //剪枝的部分,相同元素再搜没有意义
}
}
return false;
}
int main()
{
int i;
while (scanf("%d",&n),n)
{
sum = 0;
for ( i = 0; i < n; i++)
{
scanf("%d",&stick[i]);
sum+=stick[i];
}
sort (stick,stick+n,cmp);//sort 函数的倒序利用
for ( l = stick[0]; l <= sum; l++)
{
if (sum % l==0)
{
num = sum/l;
memset(mark,false,sizeof(mark));
if (dfs(1,0,-1))//深搜开始
{
printf("%d\n",l);
break;
}
}
}
}
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-19573.html