#include <stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int found,len,ans,n,flag[101],s[101];
bool compare(int a,int b){ return a<b; }
void dfs(int k,int x,int num)
{
if(num==ans)
found=1;
else if(x==len)
dfs(0,0,num+1);
else
{
int pre=-1; //记录前一个的长度
for(int i=k;i<n;i++){
if(!flag[i] && pre!=s[i] && s[i]+x<=len){
flag[i]=1;
pre=s[i];
dfs(i+1,s[i]+x,num);
flag[i]=0;
if(found || k==0)
return ;
}
}
}
}
int main()
{
int sum,i,max;
while(scanf("%d",&n) , n){
found=0;
sum=0;
max=0;
for(i=0;i<n;i++){
scanf("%d",&s[i]);
sum+=s[i];
max=(max>s[i]?max:s[i]);
}
sort(s,s+n,compare);
for(i=max;i<=sum;i++){
if(sum%i==0){
memset(flag,0,sizeof(flag));
len=i;
ans=sum/i-1;//最后一根没有必要去运算了
dfs(0,0,0);
if(found)
break;
}
}
if(found)
printf("%d\n",len);
else
printf("%d\n",sum);
}
return 0;
}
hdu1455 Sticks 小弟初次回溯 有点吃力
最新推荐文章于 2017-04-15 21:45:07 发布