天天看点

poj1011(深搜+剪枝)

题意:给m根木棍,将它们重新拼成n根一样长的木棍,并使得n尽量大(即每个新木棍尽量短)。

解法:经典的搜索题目。从小到大枚举拼成的新木棍长度,每次枚举进行一次深搜。这题关键是如何剪枝。

         1、当枚举的长度不能整除总长度的时候,剪枝;(这个很显然)

         2、先将木棍从长到短排序,枚举时先尝试长的木棍。(先枚举长的可以使得搜索深度不至于过深)

         3、深搜时,不要企图通过换掉一个新木棍的第一根来改变失败的局面(换掉第一根a,那么a也会在以后的新木棍中被使用,但是已经证明了a无法拼成了,所以不必再尝试下去了)

         4、不要企图换掉新木棍的最后一根来改变失败的局面。(同理3)

         5、如果一根木棍试过不行之后,不用再尝试将其换为之后一样长的木棍了。(很显然的剪枝)

   代码: