题目描述:(此题目是2012北大信科夏令营上机考试题目)
9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0
6 5
从下面几个方面考虑:
1. 原始木棍的长度应该大于等于折断子木棍的最大长度
2.所有子木棍的长度之和应该应该能够被当前猜测的子木棍的长度整除
3.满足2后,还应该在2假设的原木棍的长度的要求下组合成n个木棍
4.组合木棍可以采用递归的思想进行,函数原型采用bool makeup(int n,int l,int sl),代表用n个子木棍组合成原始长度为l的m(m值任意,与此题目无关)个子木棍和一个长度为sl的木棍,递归出口为剩余n=0个子木棍时sl恰好为0
5.还必须要考虑时间复杂度的影响,从下面两个因素进行改进
首先将所有子木棍进行排序
a.如果当前所采用的子木棍是作为拼接木棍的第一个而失败,那么这个试探就可以终止,肯定不会成功。因为假如可行那么每一个木棍(当然包括第一个)一定会用得到。
b.如果当前所采用的木棍时作为拼接木棍的最后一个而失败,也终止。因为这根木棍可以用后面更短的进行拼接,效果一致。
代码:
#include
#include
#include
using namespace std;
int num;
int len[100];
int used[100];
bool compare(const int argv1,const int argv2)
{
return argv1>argv2;
}
bool makeup(int n,int l,int sl)
{
if(n==0&&sl==0)
{
return true;
}
if(sl==0)
{
sl=l;
}
if(n>0)
{
int i=0;
for(i=0;i>num;
while(num>0)
{
int sum=0;
for(int i=0;i>len[i];
sum+=len[i];
used[i]=0;
}
sort(len,len+num,compare);
for(int i=len[0];i<=sum;i++)
{
if(sum%i==0)
{
if(makeup(num,i,i))
{
cout<>num;
}
}
给一个详细解题的参考链接:
http://blog.sina.com.cn/s/blog_7393daaf0100sx0q.html