#include
#include
#include
using namespace std;
int cmp(int a,int b)
{
return a>b;
}
int s[70],n,sum,amount,len; //sum表示木棍的总长度,amount表示等长的木棍的条数,len表示等长的木棍的长度
bool v[70];
bool dfs(int num,int cur,int left) //num表示已组成的新木棍数目,cur表示搜索到的下标
{
//left表示组成新木棍还需要的长度
if(num==amount) return true; //如果已经组成足够的新木棍数量,则返回
for(int i=cur+1; i
{
if(v[i]) continue;
if(s[i]==left)
{
v[i]=true;
if(dfs(num+1,-1,len)) //成功组成一条新木棍,则重新开始搜索
return true;
v[i]=false;
}
else if(s[i]
{
v[i]=true;
if(dfs(num,i,left-s[i])) //未组成一条新木棍,继续搜索
return true;
v[i]=false;
}
if(left==len) return false; //重要剪枝,若这条木棍未被使用,则往后也不会使用它,这个新长度直接舍弃
while(s[i]==s[i+1]) i++; //剪枝,如果当前和上一次搜到的木棍是一样长的则没必要再搜一次了
}
return false;
}
int main()
{
while(cin>>n,n)
{
sum=0;
for(int i=0; i
{
cin>>s[i];
sum+=s[i];
}
sort(s,s+n,cmp);
memset(v,false,sizeof(v));
for(len=s[0]; len<=sum; len++) //注意有可能原先只有一条木棍
{
if(sum%len>0) continue; //若总长度除以等长的木棍的长度有余数,则不可能满足这个长度
amount=sum/len;
if(dfs(1,-1,len))
{
cout<
break;
}
}
}
return 0;
}