1.概念:java
回溯法其實是上一個相似枚舉的搜索嘗試過程,主要是在搜索嘗試過程當中尋找問題的解,當發現不知足要求的解條件時,就「返回」,嘗試別的路徑。算法
回溯法是一種優先搜索法,按照選優條件向前搜索,以達到目標。可是當搜索到某一步時,發現原先選擇的並非最優的或者達不到目標,就退回一步,從新選擇。框架
許多複雜的,規模較大的問題均可以使用回溯法。函數
2.基本思想code
在包含問題的全部解的解空間樹中,按照深度優先搜索的策略,從根節點出發深度探索解空間樹。當探索到某一節點時,要先判斷該節點是否包含問題的解,若是包含,就從該節點繼續出發,探索下去,若是街邊不包含問題的解,則逐層回溯到祖先節點。(主要的思想是深度優先遍歷)class
3.回溯法的的通常步驟:擴展
(1) 針對所給的問題,肯定問題的解空間,解空間至少包含問題的一個最優解搜索
(2)肯定節點的擴展搜索規則遍歷
(3)以深度優先方式搜索解空間,利用「剪枝函數」進行吧避免無效的搜索。co
4算法框架:
int[] a =new int [n]; try(int i) { if(i>n) 輸出結果; else { for(int i=0;i<=上界;j++) { if(fun(j) { a[i]=j; ... try(i+1); } ) } } }
分支限界法的搜索方式是以廣度優先或者以最小耗費優先的方式進行搜索空間樹。