深度優先搜尋

2021-08-17 05:36:08 字數 1377 閱讀 9425

深度優先搜尋是一種列舉所有完整路徑以遍歷所有情況的搜尋方法。

從起點開始前進,當碰到岔道口時,總是選擇其中一條岔路前進,在岔路上如果又遇到新的岔道口,

仍然選擇新岔道口的其中一條岔路前進,直到碰到死胡同才回退到最近的岔道口選擇另一條岔路。

例1:有n件物品,每件物品重量為w[i],價值為v[i]。現在需要選出若干物品放入乙個容量為bag的揹包中,

使得在選入揹包的物品總重量不超過容量bag的情況下,讓揹包中物品的價值之和最大。

求最大價值。(1<=n<=20)

輸入:5 8

3 5 1 2 2

4 5 2 1 3

輸出:10

解:

public class main 

dfs(i + 1, w + weight[i], v + value[i]);// 選第i件物品

} }public static void main(string args)

}

例2:給定n個整數(可能有負數),從中選擇k個數,使得這k個數之和恰好等於乙個給定的整數x。

如果有多種方案,選擇它們中平方和最大的乙個。

資料保證這樣的方案唯一。

輸入:4

2 3 3 4

2  輸出:2 4

解:

public class main 

return;

} // 已經遍歷完n個數,或選了超過k個數,或和超過x,均返回

if (i == n || nowk > k || sum > x)

return;

c.add(a[i]);// 編號為i的數進入臨時佇列

dfs(i + 1, nowk + 1, sum + a[i], sump + a[i] * a[i]);// 選編號為i的數

c.polllast();// 編號為i的數退出臨時佇列

dfs(i + 1, nowk, sum, sump);// 不選編號為i的數

} public static void main(string args)

}

上面問題中的每個數都只能選擇一次,現在稍微修改題目:

假設n個整數中的每乙個都可以都可以被選擇多次,那麼選擇k個數,使得k個數之和恰好為x。

假設有三個數1、4、7,需要從中選5個數,使它們的和為17。

顯然只需要選3個1和2個7,即可得到17。

解:由於每個整數都可以被選擇多次,因此當選擇了i號數時,不應當直接進入i+1號數的處理。

應當繼續選擇i號數,直到某個時刻決定不再選擇i號數,就會通過「不選編號為i的數」這條分支進入i+1號數的處理。

因此只需要把「選編號為i的數」這條分支的**中的i+1修改為i即可。

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

前言 這幾天複習圖論演算法,覺得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...