演算法 回溯法

2021-09-20 10:34:56 字數 1853 閱讀 2390

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 以...