最基礎的窮竭(深度)搜尋問題 python

2021-09-26 21:52:27 字數 2012 閱讀 9543

窮竭搜尋是將所有的可能性羅列出來,在其中尋找答案的方法

深度搜尋的優化技巧 題目

給定整數a1,a2,…an,判斷是否可以從中選出若干數,使它們的和恰好為k

思路:該題就是從第乙個數開始遍歷所有的可能,對於第乙個數,可以選擇加與不加兩種可能,第二數也可以選擇加與不加兩種可能,兩者進行組合進行組合有2*2種可能,所以複雜度為o(2^n)

import numpy as np

# a的個數

n =100

# 給定的數a

a = np.random.randint(1,

20,100)

# k為目標數

k =50

defdfs

(i,sum):

# 函式結束的條件

if i == n:

return

sum== k

# 該數選擇不加情況

if dfs(i+1,

sum)

:return

true

# 該數選擇加的情況

if dfs(i+1,

sum+a[i]):

return

true

return

false

print

(dfs(0,0))

稍微的改進(剪枝):

import numpy as np

# a的個數

n =100

# 給定的數a

a = np.random.randint(1,

20,100)

# print(a)

# k為目標數

k =50

defdfs

(i,sum):

# 函式結束的條件

if i == n:

return

sum== k

ifsum== k:

return

true

# 如果大於目標數,該分支可以不再進行遍歷

ifsum

> k:

return

false

# 該數選擇不加情況

if dfs(i+1,

sum)

:return

true

# 該數選擇加的情況

if dfs(i+1,

sum+a[i]):

return

true

return

false

print

(dfs(0,0))

斐波那契數列
def

fun(n)

:if n ==

1or n ==2:

return

1return fun(n-1)

+fun(n-2)

print

(fun(10)

)

該函式就是遍歷所有的可能,所以求稍大的數時,花費的時間會十分的大。

推導過程

改進**(記憶化):

# num用來存放計算過的資料

num =

[none]*

1000

deffun

(n):

if n ==

1or n ==2:

return

1if num[n]

!=none

:return num[n]

num[n]

= fun(n-1)

+fun(n-2)

return num[n]

print

(fun(10)

)

經典的深度搜尋問題——八皇后問題

參考鏈結

最基礎的窮竭搜尋(2)

特殊狀態的列舉 雖然生成可行空間多數採用深度優先搜尋,但在裝態空間比較特殊時其實可以簡短的實現。比如,c 標準庫中提供了next permutation函式,它可以把n個元素共n 中不同的排列組合生成出來。又或者,通過使用位運算子,可以列舉出從n個元素中取出k個的所有情況,或某個集合的所有子集。in...

最基礎的深度優化搜尋 dfs 題目

前幾天回看自己大一剛開學刷oj時遇到的一道迴圈類題目,結合這個假期自已學的一點點演算法知識,重新寫了段 也算是加深自己對dfs的理解了。題目描述 將1,2,9共9個數分成3組,分別組成3個三位數,且使這3個三位數構成1 2 3的比例,試求出所有滿足條件的3個三位數。從演算法層面上說 這是一道最基礎的...

演算法基礎 城堡問題 深度優先搜尋演算法

題目 圖1是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成m n m 50,n 50 個方塊,每個方塊可以有0 4面牆。輸入 程式從標準輸入裝置讀入資料。第一行是兩個整數,分別是南北向 東西向的方塊數。在接下來的輸入行裡,每個方塊用乙個數字 0 p 50 ...