#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<ctype.h>
#include<stack>
#include<math.h>
#include <string>
#include<algorithm>
#include <iterator>
using namespace std;
typedef unsigned long long ULL;
bool cmp(const int a,const int b)
{
return a>b;
}
int book[65],stick[65],len,n;
bool dfs(int i,int l,int t)//序号,最小长度,总长度
{
if(l==0)
{
t-=len;
if(t==0)
return true;//n根木条被剪下
for(i=0;book[i];i++);
book[i]=1;
if(dfs(i+1,len-stick[i],t))
return true;
book[i]=0;
t+=len;
}
else
{
for(int j=i;j<n;j++)//减枝
{
if(j>0&&!book[j-1]&&(stick[j]==stick[j-1]))
continue;
if(!book[j]&&l>=stick[j])
{
book[j]=1;
l-=stick[j];
if(dfs(j,l,t))
return true;
book[j]=0;
l+=stick[j];
}
}
}
return false;
}
int main()
{
int sum;;
while(cin>>n&&n)
{
sum=0;
for(int i=0;i<n;i++)
{
scanf("%d",&stick[i]);
sum+=stick[i];
}
bool flag=false;
sort(stick,stick+n,cmp);
memset(book,0,sizeof(book));
for(len=stick[0];len<=sum/2;len++)
{
if(sum%len==0)
if(dfs(0,len,sum))
{
flag=true;
cout<<len<<endl;
break;
}
}
if(!flag)
printf("%d\n",sum);
}
return 0;
}
/*
*/
POJ 1011 UVA 307 Sticks(递归)
最新推荐文章于 2018-07-20 10:53:29 发布