深度优先搜索

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

深度优先搜索

深度优先搜索(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 20
int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值