深度優先搜尋 1

2021-10-13 05:28:05 字數 3326 閱讀 5474

1.裝載問題

思路:每種貨物有兩種可能:裝與不裝,所以只用在遞迴時迴圈兩種可能即可,然後把每次的值進行maxn然後輸出(前提當前的sum<=承重量)。

注意:計算是否超標需用乙個變數儲存,防止重複計算,否則會超時。

**:

#include

using

namespace std;

int a[46]

, maxn =-1

, n, c, t;

void

work

(int deep,

int sum)

for(

int i =

0; i <=

1; i++

)else

work

(deep +

1, sum);}

}int

main()

2.工作分配問題

思路:用乙個陣列標記每種工作是否已經有人正在做,然後已經在做則continue,然後對於所有方案求出最小值。

注意:如果當前的sum已經超過minn,則可以直接結束,不然會爆最後2個點。

**:

#include

using

namespace std;

int a[21]

[21], minn = int_max, n;

bool v[21]

;void

work

(int deep,

int sum)

for(

int i =

1; i <= n; i++)}

intmain()

3.有重複元素的排列問題

思路:先把序列從小到大排序,再把26個字母的個數統計,沒有則continue,有就把個數減少,其餘跟全排列一模一樣。

注意點:要把字元先轉化成整數,再把整數轉化成字元。

**

#include

using

namespace std;

int n, t;

char s[

1000];

char v[

1000];

int v2[27]

;void

work

(int deep)

for(

int i =

1; i <=

26; i++)}

intmain()

4.最佳排程問題

思路:把每個任務分別放在k臺機器上,然後求出這些機器工作時間的最大值,在把每種排程方法求出最小值,輸出。

注意點:1.把maxn可以提前算出,大於minn直接跳過,加快速度。2。在此基礎上,把所有任務從大到小排序,可以更加快。

**

#include

using

namespace std;

int n, k, x[

100]

, a[

100]

, minn = int_max;

bool

cmp(

int a,

int b)

void

work

(int deep,

int maxn)

for(

int i =

1; i <= k; i++)}

intmain()

5.字串行

思路:用1、2、3來表示a、b、c,如果長度超過4了,就判斷從當前序列末尾倒數4個,判斷是否重複,如果相等則不合法,合法則++。

注意點:這裡不合法是continue,不是return

**

#include

using

namespace std;

int n, a[13]

, b[4]

, t;

void

work

(int deep)

for(

int i =

1; i <=

3; i++

)work

(deep +1)

;}}int

main()

7.【經典】n皇后問題

思路:可以把行不考慮,直接考慮列和對角線,處於同一左對角線的所有兩個座標之和相等,處於同一右對角線的所有兩個座標之差相等,只要把它們全部存下來,看看有無重複就行。

**

#include

using

namespace std;

int l[14]

, z[14]

, y[14]

, t, n;

bool flag;

void

work

(int deep,

bool flag =

false

)for

(int i =

1; i <= n; i++)if

(flag ==

true

) l[deep]

= i;

z[deep]

= deep + i;

y[deep]

= deep - i;

work

(deep +1)

;}}int

main()

8.子集和問題

思路:弄乙個sum,然後把元素加進去,超過c了return,等於則把它輸出,然後瘋狂return退出。

注意點:這裡要把字尾和算好,如果後面全部加起來都達不到,則也可以return

**

#include

using

namespace std;

int n, c, a[

10001

], i, x[

10001

], j, s[

10001];

bool b[

10001

], flag;

void

work

(int deep,

int sum,

int i)

for(

; i <= n; i++)}

intmain()

廣度優先搜尋 深度優先搜尋

前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...

廣度優先搜尋,深度優先搜尋

深度優先搜尋 depth first search 簡稱dfs。最直觀的例子就是 走迷宮 廣度優先搜尋 每個頂點都要進出一遍佇列,每個邊也都會被訪問一次,所以 時間複雜度o v e 主要消耗記憶體的是visited prev陣列 queue佇列,所以 空間複雜度o v 深度優先搜尋 每條邊最多會被訪...

深度優先搜尋 廣度優先搜尋

深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 package com.neusoft.data.structure 深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 public class dfsbfs 初始化 邊 mmatrix new int vlen vlen for...