这是一个典型的搜索,最大的剪枝是是对相同长度stick的处理
#include <memory.h>
#include <algorithm>
using namespace std;
#define MAXN 64
int n,m,len,w;
int s[MAXN];
int flag[MAXN];
int com(int a,int b)
{
return a>b;
}
void dfs(int k,int sum,int count)
{
if(count==m)
{
w=1;
return;
}
else if(sum==len) dfs(0,0,count+1);
else
{
if(w==1)return;
for(int i=k,p=-1;i<n;i++)
if(!flag[i]&&s[i]!=p&&sum+s[i]<=len)
{
p=s[i];
flag[i]=1;
dfs(i+1,sum+s[i],count);
flag[i]=0;
if(k==0||w==1)return;
}
}
}
int main()
{
freopen("D://in.txt","r",stdin);
int i,sum;
while(scanf("%d",&n)!=EOF&&n)
{
w=0; sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&s[i]);
sum+=s[i];
}
sort(s,s+n,com);
for(len=s[0];len<sum;len++)
{
if(sum%len==0)
{
m=sum/len;
memset(flag,0,sizeof(flag));
dfs(0,0,0);
if(w==1)break;
}
}
printf("%d/n",len);
}
return 0;
}