木棒
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 153154 | Accepted: 36529 |
Description
乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。
Input
输入包含多组数据,每组数据包括两行。第一行是一个不超过64的整数,表示砍断之后共有多少节木棍。第二行是截断以后,所得到的各节木棍的长度。在最后一组数据之后,是一个零。
Output
为每组数据,分别输出原始木棒的可能最小长度,每组数据占一行。
Sample Input
9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0
Sample Output
6 5
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
int len;
int compare(const void* a,const void* b)
{
return (*(int*)b-*(int*)a);
}
bool dfs(int* stick,bool*vist,int nowlen,int length, int s, int sticknum)
{
if (sticknum==len)
return true;
int sample = -1;
for(int i = s;i<len;i++)
{
if(vist[i]||stick[i]==sample)
continue;
vist[i] = true;
if(nowlen+stick[i]<length)
{
if(dfs(stick,vist,nowlen+stick[i],length,i,sticknum+1))
return true;
else
sample = stick[i];
}
else if(nowlen+stick[i]==length)
{
if(dfs(stick,vist,0,length,0,sticknum+1))
return true;
else
sample = stick[i];
}
sample = stick[i];
vist[i]=false;
if(nowlen==0)
break;
}
return false;
}
int main(void)
{
while(cin>>len&&len)
{
int * num = new int[len];
bool * isUse = new bool[len];
int sum =0;
for(int i=0;i<len;i++)
{
cin>>num[i];
sum +=num[i];
isUse[i]=false;
}
qsort(num,len,sizeof(int),compare);
int maxnum = num[0];
bool flag =false;
for(int j =maxnum;j<=sum/2;j++)
{
memset(isUse,false,len);
if(!(sum%j)&&dfs(num,isUse,0,j,0,0))
{
cout<<j<<endl;
flag = true;
break;
}
}
if(!flag)
cout<<sum<<endl;
delete []num;
delete []isUse;
}
return 1;
}