深搜——剪枝
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int num[1000],vis[1000];
int n,Sum;
int s,K;
int flag;
//木棍序号 已完成边数 当前木棍长度
void dfs(int x,int k,int sum)
{
int i;
int last=-1;
if(flag)
return;
if(k==K-1)
{
flag=1;
return ;
}
for(i=x;i<n;i++)
{
if(!vis[i]&&sum+num[i]<=s&&last!=num[i])
{
last=num[i];
vis[i]=1;
if(sum+num[i]==s)
dfs(0,k+1,0);
else {
dfs(i+1,k,sum+num[i]);
vis[i]=0;
if(flag||x==0)//x==0 缺了这个就超时
return;
}
}
}
int main()
{
int i;
while(cin>>n&&n)
{
Sum=0;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
{
cin>>num[i];
Sum+=num[i];
}
sort(num,num+n,cmp);
for(i=num[0];i<=Sum;i++)
{
if(Sum%i==0)
{
memset(vis,0,sizeof(vis));
s=i;
K=Sum/i;
flag=0;
dfs(0,0,0);
if(flag)
{
printf("%d\n",i);
break;
}
}
}
}
return 0;
}