我来更新了!
深度优先搜索
深度优先搜索(简称深搜或DFS)。
深搜的遍历过程如下:
首先找一个未被遍历过的顶点、比如a1,因为 a1 已经访问过了,所以,需要标记 a1 的状态为访问过。然后遍历 a1 旁边的邻近点,比如 a2 ,并标记a2的状态为访问过,然后访问 a2 的邻接点,例如 a3,然后记录a3已被访问过 ,然后一直往下遍历,直到访问到某个点时,根据之前做的标记发现这个点周围的邻近点均被访问过了时,就从这个点退回到上一个点,在看上一个点是否有没有被访问过的邻近点,如果上一个节点也没有没有被访问过的邻近点,就继续往上退,直到找到某一个节点的没有被访问过的邻近点。
最后需要查看是否每个节点都已经被访问过,如果还有没有被访问过的节点,那么就把这个节点标记成新的顶点并按照上面的方法继续遍历,直到全部访问完为止。这就是深度优先搜索的遍历过程。
深度优先搜索是一个不断回溯的过程
模版
void dfs(int k){//声明无返回值函数dfs并声明变量k
if(所有的空都填完了){
记录/判断最优解;
return ;
}
for(枚举这个空能填的){
if(合法)
{
记录下这个空;
dfs(k+1);//遍历下一个点
取消这个空(恢复/回溯);
}
}
}
例题
数字的和
描述
在一个数列当中,选择不同的数字相加结果可能是一个相同的值。例如数列1,2,3,4,5中选择数字1,4相加和选择数字2,3相加的结果是相同的。现设计一个程序,输入n个数字,求这n个数字之中,选择数字相加起来等于sum的方案数,与选择数字的顺序无关。
输入
输入三行
第一行输入数字n,确定数列数字的个数。
第二行输入n个数字
第三行输入一个数字sum,确定选择的数字相加的和
输出
输出选择若干数字和为sum的方案数量
输入样例 1
5 1 2 3 4 5 9
输出样例 1
3
代码如下
#include <bits/stdc++.h>
using namespace std;
int n;
int hh;
int h[30];
int sum;
void dfs(int k,int a)
{
if(k>n || a>=sum)
{
if(a==sum)
{
hh++;
}
return ;
}
dfs(k+1,a+h[k]);
dfs(k+1,a);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>h[i];
}
cin>>sum;
dfs(1,0);
cout<<hh;
return 0;
}
撒花✿✿ヽ(°▽°)ノ✿