0.0 回溯法核心**
go
(depth)
//begin from go(0)
1.0 八皇后問題
問題描述:將八位皇后放在一張8x8的棋盤上,使得即任意兩個皇后都不在同一條橫線,豎線和斜線上,問一共有多少種擺法?暴力窮舉:
step 1:先不考慮對稱性和可行性,一共是c(8
64)
c\tbinom
c(648
)種可能,約40億次搜尋;
step 2:換種思路,由於不能在乙個橫線上,因此每行乙個皇后;又不能在乙個豎線上,因此每一行避開上面已覆蓋的列;一共是8!種可能,約4萬次搜尋;
#include
using namespace std;
int x[8]
[8];
//0:空 1:有皇后
intcheck
(int i,
int j)
;//檢查在(i,j)處放上乙個新皇后,是否滿足條件
intputqueen
(int i)
;//表示放置第i行的皇后
int ans =0;
//最後答案
intcheck
(int i,
int j)
for(
int m = i-
1,n = j-
1; m>=
0&& n>=
0; m--
,n--
)for
(int m = i-
1,n = j+
1; m>=
0&& n<=
7; m--
,n++
)return1;
}int
putqueen
(int i)
for(
int j=
0; j<
8; j++
)//不符合條件,回退一步,重新搜尋
x[i]
[j]=0;
}}intmain()
2.0 01揹包問題
問題描述:有n件物品和乙個容量為c的揹包。第i件物品的價值是v[i],重量是w[i]。求解將哪些物品裝入揹包可使價值總和最大。所謂01揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。
#include
#include
using namespace std;
int n;
//物品數量
int c;
//揹包容量
int w[
100]
;//每個物品的重量
int v[
100]
;//每個物品的價值
int sum_w=0;
//已選總質量
int sum_v=0;
//已選總價值
int max_v=0;
//累計最大總價值
intsearch
(int);
intsearch
(int num)
if(sum_w + w[num]
<= c)
search
(num+1)
;}intmain()
演算法 回溯法
用回溯法解問題時,應明確定義問題的解空間。問題的解空間至少包含問題的乙個 最優 解。例如對於有n種可選擇物品的0 1揹包問題,其解空間由長度為n的0 1向量組成。該解空間包含對變數的所有可能的0 1賦值。例如n 3時,其解空間是 定義了問題的解空間後,還應該將解空間很好地組織起來,使得能用回溯法方便...
演算法 回溯法
用回溯法解問題時,應明確定義問題的解空間。問題的解空間至少包含問題的乙個 最優 解。例如對於有n種可選擇物品的0 1揹包問題,其解空間由長度為n的0 1向量組成。該解空間包含對變數的所有可能的0 1賦值。例如n 3時,其解空間是 定義了問題的解空間後,還應該將解空間很好地組織起來,使得能用回溯法方便...
ACM演算法 回溯法
回溯法 為了避免生成那些不可能產生最佳解的問題狀態,要不斷地利用限界函式 bounding function 來處死那些實際上不可能產生所需解的活結點,以減少問題的計算量。具有限界函式的深度優先生成法稱為回溯法!回溯法基本思想 1 針對所給問題,定義問題的解空間 2 確定易於搜尋的解空間結構 3 以...