用当前的木棍拼木棒,问能拼成x(x>=1)根等长木棒的最小长度是多少
首先考虑由最大的木棒开始拼,边界条件为所有木棍拼接成一根木棒,因此答案就在max~sum之间枚举。注意一个需要满足的性质是,木棒的总长度sum%当前长度len==0,因为要拼成整数个等长木棒,进行搜索即可
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int size = 65;
int len , stick[size];
bool vis [size];
int n,sum;
bool flag;
bool cmp(int a,int b)
{
return a>b;
}
void cal(int dep, int now_len, int u)
{
if(flag )
return ;
if(now_len == len )
{
if(dep ==n)
{
flag = true;
}
else
cal(dep,0,0);
return ;
}
else if(now_len == 0 )
{
int k = 0;
while(vis[k])
k++;
vis[k] = true;
cal(dep+1, stick[k], k+1);
vis[k] = false;
}
else
{
for(int i = u; i < n;i++)
{
if(!vis[i]&&now_len+ stick[i]<=len)
if(!vis[i-1]&&stick [i-1] == stick[i]) continue;
else
{
vis[i] = true;
cal(dep+1, now_len+ stick[i],u+1);
vis[i] = false;
}
}
}
}
int main()
{
while(cin>>n,n)
{
sum = 0;
flag = false;
for(int i =0; i< n ; i++)
{
cin>>stick[i];
sum+= stick[i];
}
sort(stick, stick + n,cmp);
int maxn = stick[0];
for( len = maxn; len< sum; len++)
{
if(sum % len == 0 )
{
memset(vis, 0, sizeof (vis));
cal(0,0,0);
if(flag)
break;
}
}
cout<<len<<endl;
}
return 0;
}
本文介绍了一种算法,该算法用于确定由给定木棍拼接成等长木棒的最小可能长度,其中涉及从最大木棒开始尝试拼接,并确保总长度能被拼接后的木棒长度整除。
327

被折叠的 条评论
为什么被折叠?



