回溯经典剪枝——小木棍

这篇博客介绍了如何帮助乔治恢复等长木棍的初始状态,通过设计一个程序来计算木棍可能的最小长度。在解决这个问题时,提出了四种剪枝策略,包括木棍排序、第一根木棍的判断、堆中最后一根木棍的判断以及避免重复选择相同的元素,以优化搜索过程,避免暴力枚举带来的效率低下问题。
摘要由CSDN通过智能技术生成

小木棍
乔治拿来一组等长的木棒,将它们随机地裁断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。
  请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。

【输入格式】

  第一行是一个整数N,表示砍断之后共有多少节木棍。
  第二行是截断以后,所得到的各节木棍的长度。在最后一组数据之后,是一个零。

【输出格式】

  输出原始木棒的可能最小长度。

【输入样例】

9
5 2 1 5 2 1 5 2 1

【输出样例】

6

【数据范围】

N<=64
每节裁断后的小木棍长度不超过50。


很明显,如果纯暴力枚举拼成的大木棍len(tot%len==0)后,枚举分成的k堆包含哪些棍子(状态函数:bool run(int i,int rest,int p)表示第i堆还差rest的长度到len,第i堆中刚才选了第p根)需要O(x*n!)的时间。。。好像慢得不止一点。
所以优化剪枝很必要。
大概的思路有:
1.减少搜索步骤(如n个状态搜索到n-1层并计算第i层);
2.加强每一步的约束条件;
3.预测性剪枝(最重要的剪枝)

本题大概有四种剪枝思路:
1.将小木棍从大到小排序:我们发现如果小段的木棍先进“队”的话回溯的层次将会比大段的木棍先进多得多。(大段的木棍约束性会更强些)。
*2.

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值