题目描述:
乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 50 。现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。
想法:
首先在读入的时候忽略掉长度大于50的木棍(最重要),顺便还要记录一下最短的木棍和最长的木棍的长度(为之后的运算剪枝),然后按照木棍的长度做一次排序(因为木棍长度都小于等于50,本人用的是桶排序),接着就可以开始搜索了。
搜索时的策略:
1、从最长的木棍的长度开始,枚举原先每根木棍的可能长度,一直到(剪枝一:) 总长度的一半(如果原先木棍的数量不为1,则原先木棍的长度必然小于所有木棍总长度的一半)。(小贴士:如果枚举完后,仍然没有输出答案,则直接输出总长度即可)(因为如果一直到总长度的一半都没有解,则说明原先的木棍就只有一根而已)
2、从(剪枝二)最长的木棍开始选择(如从最短的木棍开始搜索,会增加回溯次数,具体原因留给读者自行思考),逐一递减,如果当前已选择的木棍的总长度加上目前准备选