这题剪枝实在是很关键!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int a[65],v[65];
int cmp(const void *a,const void *b)
{
return *(int *)b-*(int*)a;
}
bool dfs(int m,int cur,int amount,int x0,int t)
{
if(amount==m)return true;
int ok=-1;
for(int i=cur;i<m;i++)
{
if(!v[i]&&ok!=a[i])
{
v[i]=1;
if(t>a[i])
{
if(dfs(m,i+1,amount+1,x0,t-a[i]))
return true;
else {ok=a[i];}
}
else if(t==a[i])
{
if(dfs(m,0,amount+1,x0,x0))
return true;
else {ok=a[i];}
}
v[i]=0;
if(t==x0)
break;
}
}
return false;
}
int main()
{
//freopen("t.txt","r",stdin);
int m,i,sum;
do
{
scanf("%d",&m);
if(m==0)break;
sum=0;
memset(v,0,sizeof(v));
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
qsort(a,m,sizeof(a[0]),cmp);
int ok=0;
for(int x=a[0];x+x<=sum;x++)
{
if(!(sum%x)&&dfs(m,0,0,x,x))
{
printf("%d\n",x);
ok=1;
break;
}
}
if(!ok)
printf("%d\n",sum);
}while(1);
return 0;
}