深度优先搜索

来源:互联网 发布:js post方式下载文件 编辑:程序博客网 时间:2024/04/30 19:50

学了很多的算法 ,但从来没有总结过。现在开始工作了,就此开始总结大学学习的计算机算法,以告慰我即将逝去的大学生活。

深度优先搜索

深度优先搜索(DFS)是搜索的手段之一,也是数据结构中的重难点,它从某个状态开始,不断的转移状态,直到状态无法转移,然后回退到前一个状态,继续转移到其它状态,如此不断重复,直到找到最终解,或搜索完全部的状态。列如求解数独,首先在某个格子内填入适当的数,然后再继续在下一个格子内填入数字,如此继续下去。如果发现某个格子无解了,就放弃一个格子上选择的数字,改用其它可行的数字。根据深度优先搜索的特点,采用递归函数实现比较简单。

题目:

  部分和问题

给定整数a1、a2、···an,判断是否可以从中选出若干数使得他们的和为k.

限制条件:

1<=n<=20

  ai、k不操过int行范围

输入:

n = 4

a = {1,2,4,7}

  k = 12

输出:

YES {13 = 2 + 4 + 7}

 

#include <iostream>using namespace std;#define MAX_N 20int num[MAX_N];int n,k;bool hash[MAX_N];bool dfs(int i,int sum){    if(sum == k)    {        return true;    }    if (i >= k)    {        return false;    }    hash[i] = false;//取第i个数    if(dfs(i+1 , sum+num[i]))        return true;    hash[i] = true;//不取第i个数    if(dfs(i+1 , sum))        return true;return false;}int main(){    cin>>n;    int i;    for(i=0;i<n;i++)    {        cin>>num[i];        hash[i] = true;    }    cin>>k;    if(dfs(0,0))    {        cout<<"YES"<<'{'<<k<<'=';        for(i=0;i<n;i++)        if(!hash[i])        {          cout<<num[i];          break;        }        for(i++;i<n;i++)        if(!hash[i])        {            cout<<'+'<<num[i];        }        cout<<'}'<<endl;    }    return 0;}

0 0
原创粉丝点击