#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int MAX = 65;
int n,stick[MAX];
bool vist[MAX];
int cmp(const void *a,const void *b)
{
return (*(int *)b-*(int *)a);
}
bool dfs(int len,int num,int Index,int InitLen)
{
if(num==n)
return true;
int temp = -1;
for(int i = Index;i < n;i++)
{
if(vist[i]||temp == stick[i]) //剪枝,相同的长度跳过
continue;
vist[i] = true;
if(stick[i]+len<InitLen){
if(dfs(len+stick[i],num+1,i+1,InitLen))
return true;
else
temp = stick[i];
}else if(stick[i]+len==InitLen)
{
if(dfs(0,num+1,0,InitLen)) //完成一根后,在重新开始找
return true;
else
temp = stick[i];
}
vist[i] = false; //dfs重要标志
if(len == 0)break;
}
return false;
}
int main()
{
//freopen("Input.txt","r",stdin);
//freopen("Output.txt","w",stdout);
while(scanf("%d",&n),n)
{
int SumLen = 0;
for(int i = 0;i < n;i++)
{
scanf("%d",&stick[i]);
SumLen += stick[i];
}
qsort(stick,n,sizeof(stick[0]),cmp);
int ans = SumLen;
for(int InitLen=stick[0];InitLen<=SumLen-InitLen;InitLen++)
{
memset(vist,0,sizeof(vist));
if(!(SumLen%InitLen)&&dfs(0,0,0,InitLen))//神来之笔啊!!!!!
{ans = InitLen; break;}
}
printf("%d\n",ans);
}
return 0;
}
0ms poj sticks || NYOJ sticks
最新推荐文章于 2017-04-27 15:45:34 发布