深度优先搜索求解部分和问题

 

深度优先算法:首先想到递归;再次找到起始状态;最后找到使递归终止的条件;

这个题的思路比较简单:对于每个数字都有两种可能,选中或者是不选中,所以从第一个开始求,要么选中....要么不选中....
终止条件就是到达最后一个数字的时候,就要终止了。(至于终止时候返回值要注意一下);
怎么写递归函数:首先要有参数可以改变,然后通过该参数终止递归;将需要改变的值都通过形参改变;

 

/*************************************************************************
	> File Name: part_sum.cpp
	> Author: 
	> Mail: 
	> Created Time: 2015年11月11日 星期三 20时16分46秒
 ************************************************************************/

#include<iostream>
using namespace std;
const int MAXNUM = 20;

int arr[MAXNUM];
int n, k;

void input_data(int *n, int *k, int *arr)
{
    cout << "n = ";
    cin >> *n;
    cout << "a = {";
    for (int i = 0; i < *n; i++){
        cin >> arr[i];
        cin.get();
        cin.get();
    }
    cout << "k = ";
    cin >> *k;
}

bool dfs(int i, int sum)
{
    if (i == n) return sum == k;
    if (dfs(i+1, sum)) return true;
    if (dfs(i+1, sum+arr[i])) return true;

    return false;
}

void solve()
{
    if (dfs(0, 0))
        cout << "Yes" << endl;
    else
        cout << "No" << endl;    
}

int main()
{
    input_data(&n, &k, arr);

    solve();

    return 0;
}

转载于:https://www.cnblogs.com/yxk529188712/p/4957362.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值