天天看點

poj1011(深搜+剪枝)

題意:給m根木棍,将它們重新拼成n根一樣長的木棍,并使得n盡量大(即每個新木棍盡量短)。

解法:經典的搜尋題目。從小到大枚舉拼成的新木棍長度,每次枚舉進行一次深搜。這題關鍵是如何剪枝。

         1、當枚舉的長度不能整除總長度的時候,剪枝;(這個很顯然)

         2、先将木棍從長到短排序,枚舉時先嘗試長的木棍。(先枚舉長的可以使得搜尋深度不至于過深)

         3、深搜時,不要企圖通過換掉一個新木棍的第一根來改變失敗的局面(換掉第一根a,那麼a也會在以後的新木棍中被使用,但是已經證明了a無法拼成了,是以不必再嘗試下去了)

         4、不要企圖換掉新木棍的最後一根來改變失敗的局面。(同理3)

         5、如果一根木棍試過不行之後,不用再嘗試将其換為之後一樣長的木棍了。(很顯然的剪枝)

   代碼: