#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int p[1000],book[1000],n;
int cmp(int x,int y)
{
return x>y;
}
int dfs(int cur,int g,int id,int cnt,int sum)//g 代表棍子长度 id代表从哪开始找
{ //cnt 代表用了几根棍子 sum代表棍子总长度
if(g*cnt==sum) //cur当前棍子长度
return 1;
for(int i=id;i<n;i++)
{
if(book[i])continue;
if(book[i-1]==0&&p[i-1]==p[i])continue;//剪枝
if(cur+p[i]==g) //找到之后再找下一组
{
book[i]=1;
if(dfs(0,g,0,cnt+1,sum))
return 1;
book[i]=0;
return 0;
}
else if(cur+p[i]<g)
{
book[i]=1;
if(dfs(cur+p[i],g,i+1,cnt,sum))
return 1;
book[i]=0;
if(cur==0)return 0;
}
}
return 0;
}
int main()
{
while(~scanf("%d",&n)&&n)
{
int sum=0;
for(int i=0; i<n; i++)
{
scanf("%d",&p[i]);
sum=sum+p[i];//棍子总长度
}
sort(p,p+n,cmp);//从大到小能够节省一部分时间
int flag=0; //标记
for(int i=p[0]; i<=sum/2; i++)//棍子最大值到所有棍子的长度的一半
{
if(sum%i==0)//因为总长度固定所以棍子长度肯定能够被总长度整除
{
memset(book,0,sizeof(book));//标记哪些短棍被用过
if(dfs(0,i,0,1,sum))//如果找到函数返回非0值;
{
flag=1;
printf("%d\n",i);
break;
}
}
}
if(flag==0)
printf("%d\n",sum);
}
}
uva-307 sticks
最新推荐文章于 2020-06-30 22:06:26 发布