#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
int n,sticks[65],number,flag,visit[65],len,sum;/*len表示木头长度,neumber表示对应木头长度的木头数目*/
int cmp(const void *a,const void *b)
{
return *(int*)b-*(int*)a;
}
void dfs(int p,int length,int num)
{
if(num==number)
{
flag=1;
}
else if(length==len)
{
dfs(0,0,num+1);
}
else
{
for(int i=p,same=-1;i<n;i++)
{
if(visit[i]!=1&&(sticks[i]+length<=len)&&sticks[i]!=same)
{
same=sticks[i]; /*剪枝,剔除相同长度*/
visit[i]=1;
dfs(i+1,length+sticks[i],num);
visit[i]=-1;
if(flag==1||p==0) /*剪枝*/
return;
}
}
}
}
int main()
{
while(cin>>n&&n)
{
sum=0;
flag=-1;
for(int i=0;i<n;i++)
{
cin>>sticks[i];
sum+=sticks[i];
}
qsort(sticks,n,sizeof(sticks[0]),cmp); /*从大到小排序*/
for(len=sticks[0];len<sum;len++)
{
if(sum%len==0)
{
memset(visit,-1,sizeof(visit));
number=sum/len;
dfs(0,0,0);
if(flag==1)
break;
}
}
cout<<(flag==1? len:sum)<<endl;
}
return 0;
}
回溯没做过几次,努力中(这次为了少敲几个字母,不用bool型,悲剧了好多次唉! 约束条件要强化,剪枝还好能想到)