迭代加深搜搜尋

2021-07-08 21:53:44 字數 880 閱讀 8738

對於可以用回溯法求解但解答樹的深度沒有明顯上限的題目,可以考慮使用迭代加深搜尋。

經典問題:埃及分數問題

給出乙個分數,比如19/45,把它寫成若干個形如1/ri的分數的和的形式,比如19/45=1/5+1/6+1/18,要求分母不能重複使用並且使用的分數的個數最少。(如果有多組個數相同的解,最後的分數的分母越小越好,這對於題目來說是次要的。)

1、分母從小到大搜尋

為了避免重複搜尋

2、使用迭代加深搜尋

求「步驟數最少」這類問題,基本上有兩種似乎:廣搜、迭代加深搜尋。對於這道題來說,如果廣搜將永遠得不到結果,分母可以無限大!但是迭代加深搜尋就比較好,雖然做了許多重複工作,但狀態空間至少被限制住了。如果當前正在列舉的分母,使得接下來的選擇即使每次都選擇最大,達到最大深度的時候也不可能達到目標分數,那麼當前正在列舉的分母及比它還大的分母,都不需要列舉了。這樣可以給分母確定乙個上界。另外,已經得到的結果加上當前列舉的分母對應的分數,要小於等於目標分數,這樣給分母確定了乙個下界(可以在o(1)的複雜度內確定這個下界)。

大神的**~

int a, b;

int tree[1000];

bool dfs(int deep, int cb, int sa, int sb )

else

return dfs( deep-1, 2, _a, _b); // 移向下一層

return

false;

}void iterativedeepening()

for (int i = 0; i <=deep; i++)

}int main ()

system("pause");

return

0;}

迭代加深搜尋

深度優先搜尋每次選定乙個分支,然後往下搜尋,直到遞迴邊界 才回溯。這種策略有一點缺陷,那就是當搜尋樹的分支數目特別 多,並且答案在某個較淺的節點上,如果dfs在一開始就選錯了分 支,那就會在沒有答案的深層次浪費時間 當搜尋樹規模隨著層次的深入增長很快,並且能 夠確保答案在乙個較淺的節點上時,就可以使...

IDDFS迭代加深搜尋

includeusing namespace std const int maxn 10 int n,a maxn bool ans sort return true int h bool dfs int d,int maxd return false int solve return max an...

IDA 搜尋 迭代加深

首先放一道例題 給出n個數,以及目標m,需要用這n個數中的若干個數加起來等於m,問所有方案中使用的數的數量最少的方案是什麼。顯然,對於這道題,我們並不知道搜尋的深度會是多少,如果放任程式像野狗一樣滿場子亂搜,那麼肯定tle無疑了。由於需要記錄答案,所以用廣搜的話空間可能會炸。於是,我們只能用深搜,為...