把长度按大到小排一次。如果此长度不行,那么所有与此长度相同的木棍直接跳过。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int sticks[65];
int used[65];
int n,len;
bool dfs(int i,int l,int t)
{
if(l==0)
{
t-=len;
if(t==0)return true;
for(i=0;used[i];i++);
used[i]=1;
if(dfs(i+1,len-sticks[i],t))
return true;
used[i]=0;
t+=len;
}
else
{
for(int j=i;j<=n;++j)
{
if(j>1&& (sticks[j]==sticks[j-1]&&!used[j-1]))
continue;
if(!used[j]&&l>=sticks[j])
{
l-=sticks[j];
used[j]=1;
if(dfs(j,l,t))return true;
l+=sticks[j];
used[j]=0;
if(sticks[j]==l)
break;
}
}
}
return false;
}
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
while(scanf("%d",&n)&&n)
{
int sum=0;
for(int i=1;i<=n;++i)
{
scanf("%d",&sticks[i]);
sum+=sticks[i];
used[i]=0;
}
sort(sticks+1,sticks+n+1,cmp);
int flag=0;
for(len=sticks[1];len<=sum/2;++len)
{
if(sum%len==0)
{
if(dfs(1,len,sum))
{
flag=1;
printf("%d\n",len);
break;
}
}
}
if(!flag)
printf("%d\n",sum);
}
return 0;
}