小木棍
小木棍
原题来自:CERC 1995
乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 。现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。
输入格式
第一行为一个单独的整数 表示砍过以后的小木棍的总数。 第二行为 个用空格隔开的正整数,表示 根小木棍的长度。
输出格式
输出仅一行,表示要求的原始木棍的最小可能长度。
样例
样例输入
9
5 2 1 5 2 1 5 2 1
样例输出
6
数据范围与提示
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,max1,a[100],b[100],sum=0;
int k,last,des,bj,h,m;
int c[100],len;
void dfs(int k,int last,int des)
{
int i,j;
if (k==m)
{
bj=1;
return;
}
if(des==0)
{
for(i=1;i<=n;i++)
{
if(c[i]==0)
{
c[i]=1;
break;
}
}
dfs(k+1,i,len-b[i]);
}
for(i=last+1;i<=n;i++)
{
if(c[i]=0&&des>=c[i])
{
c[i]=1;
dfs(k,i,des-b[i]);
c[i]=0;
if(i==n)
break;
}
}
}
main()
{
int i;
cin>>n;
for (i=1;i<=n;i++)
{
cin>>a[i];
sum=sum+a[i];
}
sort(a+1,a+n+1);
for(i=1;i<=n;i++)
b[i]=a[n-i+1];
for (h=b[1];h<=sum;h++)
{
if(sum%h==0)
{
memset(c,0,sizeof(c));
m=sum/h;
bj=0;
len=h;
dfs(1,1,len-b[1]);
if(bj==1)
break;
}
}
cout<<h<<endl;
}

浙公网安备 33010602011771号