深度優先搜尋(dfs)基礎篇之二,選數

2021-10-01 02:32:54 字數 942 閱讀 9429

題目描述

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

輸入

首先,n和k,n表示數的個數,k表示數的和。

接著一行n個數。

(1<=n<=20,保證不超int範圍)

輸出

如果和恰好可以為k,輸出「yes」,並按輸入順序依次輸出是由哪幾個數的和組成,否則「no」

樣例輸入

4 13

1 2 4 7

樣例輸出

yes2 4 7

這是一道簡單的深度優先搜尋演算法題,因為 n<=20,所以容易想到暴力法,但是這道題並沒有說明組合數的個數,也就是說可以是1個數符合,也可以3個4個數符合,這樣我們寫for迴圈時,時間複雜度就會很高,很難通過oj。

使用深度搜尋,遞迴會把所有情況都考慮在內,只需要寫dfs函式就可以搞定。

直接上**!

#include

#include

#include

#include

int n,sum;

int s=

0,f=0;

int a[30]

,b[30];

void

dfs(

int x)

printf

("\n");

}}}for

(k=x; kintmain()

dfs(0)

;//從第乙個數進入dfs

if(f==0)

//此時遞迴結束,如果f仍為0,則說明沒有符合條件的組合

printf

("no\n");

return0;

}

深度優先搜尋DFS

作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...

深度優先搜尋 DFS

深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v 0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。你可以跳過第二節先看第三節,還是引用上篇文章的樣例...

深度優先搜尋(dfs)

深度優先搜尋的一般步驟 1 從頂點v出發,訪問v。2 找出剛才訪問過的頂點的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直到剛訪問的頂點沒有沒有未被訪問過的鄰接點為止。3 返回前乙個訪問過的仍有未被訪問過的鄰接點的頂點,找出該頂點的下乙個未被訪問過的鄰接點,訪問該頂點。4 重複...