窮竭搜尋是將所有的可能性羅列出來,在其中尋找答案的方法
深度搜尋的優化技巧 題目
給定整數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 ...