题目要求将一系列的sticks重新组合,形成若干相等相等长度的木棒,且尽量使木棒长度最小,如果数据量比较小的话,就纯粹是搜索了,但题目要求的 sticks可能达到64根,如果纯粹的搜索则显然是会远远超过1000ms的,因而也就把剪枝放在了很重要的位置。从第一根stick开始,寻找下一根 stick使两者的长度小于等于木棒的长度,然后再寻找下一根stick,直到和为一根木棒的长度;然后又从一根没有被使用的stick开始进行下一根木棒的组合。概括一点说,就是一个深度优先搜索。
算法很清晰,然而真正写起来却有不少要注意的地方.
1.首先是used[]的恢复,当某一步搜索走不通的时候,不能忘记将used[i]置为false.
2.其次是剪枝的采用,当第i步时,剩余最大的sticks[i]等于restLen时,继续搜索还是走不通的话,那么这一步取sticks[j],j>i也不会成功,所以此时返回false就行了。不然的话,会超时的。