搜索学习笔记——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;
}

0 0
原创粉丝点击