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

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

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

/*************************************************************************
	> 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;
}

时间: 2024-10-10 16:10:51

深度优先搜索求解部分和问题的相关文章

POJ1979 Red and Black

问题链接:POJ1979 Red and Black. 题意简述:输入正整数w和h,w为列数,h为行数.输入h×w矩阵 (1 <= h <= 20; 1 <= w <= w),其中'.'代表可到达,'#'代表不可到达,'@'代表开始点.问从'@'开始可以到达最多多少个点. 问题分析:本题可以使用深度优先搜索求解,用广度优先搜索也可以求解,差别不大.需要注意的是'@'也算一个可以到达的点. 程序说明如下: 1.方向数组 使用方向数组后,各个方向的试探的程序就会变得简洁了,用循环处理即

八数码问题:C++广度搜索实现

毕竟新手上路23333,有谬误还请指正. 课程设计遇到八数码问题(这也是一坨),也查过一些资料并不喜欢用类函数写感觉这样规模小些的问题没有必要,一开始用深度搜索却发现深搜会陷入无底洞,如果设定了深度限制又会有很多情况无法找到,然后果断放弃,改用广度搜索.  如果要改善代码效率还可以用双向搜索,即从起始状态和最终状态同时搜索,找到相同状态,这样搜索时间会缩短一半.此外还可以用A*(启发式算法)会显得高端很多. 题目要求: 在一个3*3的棋盘上,随机放置1到8的数字棋子,剩下一个空位.数字可以移动到

POJ2386 Lake Counting

这个题与UVa572 Oil Deposits完全相同,程序改两个字符,改了一下结束条件就通过了. 问题链接:POJ2386 Lake Counting. 题意简述:给定m×n矩阵 (1 <= N <= 100; 1 <= M <= 100),其中'W'代表水域,'.'代表陆地,问有几片湖. 本题可以使用深度优先搜索求解,用广度优先搜索也可以求解,差别不大. 这个程序说明如下: 1.方向数组 使用方向数组后,各个方向的试探的程序就会变得简洁了,用循环处理即可. 2.避免重复搜索 将

HDU5319 Painter

问题链接:HDU5319 Painter. 本题可以使用深度优先搜索求解. 红色刷子("R"刷子)按"\"的方向刷,蓝色刷子("B"刷子)按"/"方向刷.一个地方如果被两次刷到变成绿色("G"色). 首先,忽略蓝色("B"色),只看红色("R"色),把绿色("G"色)也看成红色(因为需要用蓝色刷子刷一下),看最少需要用红色刷子刷几次:然后,忽略红色

【搜索】 1220:单词接龙题解

▍题目分析 1220:单词接龙 时间限制: 1000 ms         内存限制: 65536 KB提交数: 1827     通过数: 998 [题目描述] 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide

编程算法 - 部分和问题 代码(C)

部分和问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定整数a1, a2, ..., an, 判断是否可以从中选出若干数, 使它们的和恰好为k. 解法很多, 最简单的解法是使用深度优先搜索, 时间复杂度O(2^n), 不是最优解法. 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <s

无向图的深度优先与广度优先搜索代码实现

图采用了邻接表的形式储存. 带不带权都无所谓的 深度优先搜索 Depth First Search 道理和树的先序遍历差不多,把将要访问的点入栈,然后从栈里取点进行访问. 由于这只是类中的一个成员函数,有些被调用的函数的具体代码将会在文章最后补上 ,但是函数功能看注释就好了 1 //深度优先 2 void GraphAdjacencyListWeight::DFSAdvanced(int StartVertex) { 3 int *visited = new int[VertexNumber];

深度优先搜索与广度优先搜索算法理解

深度优先搜索算法和广度优先搜索算法是图论中两个有意思也很实用的算法,下面我们来看看这两个算法. 严书中,给出的利用深度优先搜索(Deep First Search)算法进行图的遍历伪码如下 1 Boolean visited[MAX]; //标志数组 2 Status (*VisitFunction)(int v); //访问函数 3 4 void DFSTraverse(Graph G, Status (*Visit)(int v)) 5 { 6 VisitFunction = Visit;

深度优先搜索 dfs C++实现

#include<map> #include<iostream> #include<string> #include<vector> using namespace std; static vector<string> order; static map<string, int > vis; void dfs(map<string, vector<string> > link, string top) {  o