搜索学习笔记——DFS
来源:互联网 发布:净水器推荐知乎 编辑:程序博客网 时间:2024/06/05 18:50
这是我学习DFS的过程。。。。
其中有错误的地方,希望各大神们跟帖指出,我是一个菜鸟,谢谢呢!
DFS(深度优先搜索)的概念:它从某一个状态开始,不断地转移状态到无法转移,然后回退到前一步的状态,继续转移到其它的状态,如此这样不断的重复,到找到最终的解为止
DFS的实现:一般都采用递归函数
什么是递归呢?
递归的含义理解就是,自身调用自身
首先,我们先来看两个简单的递归函数,递归求阶乘和斐波那契数列问题
代码实现:
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int ar[1001];
long long Fact(int n)
{
if(n==0)
return 1;
return n*Fact(n-1);
}
long long Fib(int n)
{
if(n<=1)
return n;
if(ar[n]!=0)
return ar[n];
return ar[n]=Fib(n-1)+Fib(n-2); //保存下n的值, 避免重复运算,防止超时
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<1001;i++)
ar[i]=0;
printf("%lld\n",Fact(n));
printf("%lld\n",Fib(n));
}
return 0;
}
最笨的搜索方法就是,爆搜!(穷竭的搜索)
不管它符不符合题意,都把它的所有可能都列举出来
例题:
给定n个整数a1,a2,a3......an,判断是否可以从中选出若干数,输出它们共有多少种组合,使它们的和恰好等于k
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int ar[1000010],n,k,ans;
void dfs(int j,int sum)
{
if(j==n)
{
if(sum==k)
{
ans++;
return ;
}
return ;
}
dfs(j+1,sum);
dfs(j+1,sum+ar[j]);
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
ans=0;
for(int i=0;i<n;i++)
scanf("%d",&ar[i]);
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}
- 搜索学习笔记——DFS
- 【算法学习笔记】深度优先搜索(DFS)
- 算法学习笔记11-DFS深度优先搜索
- linux 学习笔记—文件搜索命令
- linux学习笔记—搜索命令
- Python学习笔记(2)—搜索路径
- 笔记——DFS
- 图的遍历记(深度和广度优先搜索—BFS&&DFS)的笔记
- 图—搜索——DFS
- hdu1312——深度搜索(dfs)
- DFS——深度优先搜索基础
- poj1010——dfs搜索题
- poj1011——剪枝dfs搜索题
- 深度优先搜索——DFS遍历
- 搜索——DFS和BFS
- hdu 1175 连连看 搜索—dfs
- DFS-深度优先搜索—2
- 深度优先搜索算法—DFS
- 二分_D
- matlab简单神经网络示例
- Rundll32.exe文件详解(显示我的电脑 取消自动登录)
- 博客
- 【Java学习】Java IO-流概念理解和知识点总结
- 搜索学习笔记——DFS
- 19. Remove Nth Node From End of List
- 顺序表应用2:多余元素删除之建表算法
- 《匿名》第五课----项目架构
- oracle数据库
- PHP5新特性 trait
- 原型模式
- org.hibernate.hql.ast.QuerySyntaxException
- 安装CYGWIN 过程,解决 下载慢的问题