简单来说就是有很多长度相同的木棍,被切分为不同长度,然后要求重新拼起来,看拼起来之后,长度相同的木棍,最短是多少长度。
这里看到几个问题
- 拼起来之后长度应该是一样的
- 从条件一推断,最段长度minL应该满足total_len % minL == 0,即最小长度可以整除总长度
- 从结论二可以推断,拼好之后最短长度应该大于所有木棍里面最长那根木棍
- 同样从条件一推断,最大长度是所有木棍的总长度,也就是只能拼成一根
- 注意,同样存在一次都不用拼的情况。
- 如果可以拼好,前面的所有木棍都拼完的时候,最后一根木棍是不需要拼的,因为肯定是那么长
然后进一步,为了拼出木棍,有什么好的拼法呢?一个考虑是,将所有木棍按从大到小排序,然后进行拼,这样可以在比较接近根的地方剪掉尽可能的情况。这样就能推理出以下几个剪枝:
- 只需要检查可以被总长度整除的长度
- 只需需要检查大于等于最长单根木棍的长度
- 对于长度等于正在尝试的长度的木棍,直接认为已经拼好,因为不管这根木棍接哪里,都是非法的
- 最后一根木棍不用拼
- 如果有一根木棍,接上去之后刚好构成需要测试的长度,那就应该接上。这是基于以下推理:如果我们换一根更长的,显然,超出我们测试的长度,非法。如果换一根更短的,即使后面这根更短的,能拼出一根相同的长度,其效果也跟使用这根长的一样,并且由于后面更短更灵活,浪费了他补齐的功能。
- 如果在开始拼一根长木棍的时候,第一根拼上去,发现不能继