P1120 小木棍 [数据加强版]

题目描述:

乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 50 。现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。

想法:

首先在读入的时候忽略掉长度大于50的木棍(最重要),顺便还要记录一下最短的木棍和最长的木棍的长度(为之后的运算剪枝),然后按照木棍的长度做一次排序(因为木棍长度都小于等于50,本人用的是桶排序),接着就可以开始搜索了。

搜索时的策略:

1、从最长的木棍的长度开始,枚举原先每根木棍的可能长度,一直到(剪枝一:) 总长度的一半(如果原先木棍的数量不为1,则原先木棍的长度必然小于所有木棍总长度的一半)。(小贴士:如果枚举完后,仍然没有输出答案,则直接输出总长度即可)(因为如果一直到总长度的一半都没有解,则说明原先的木棍就只有一根而已)

2、从(剪枝二)最长的木棍开始选择(如从最短的木棍开始搜索,会增加回溯次数,具体原因留给读者自行思考),逐一递减,如果当前已选择的木棍的总长度加上目前准备选

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值