博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深度优先搜索-----部分和问题
阅读量:6605 次
发布时间:2019-06-24

本文共 951 字,大约阅读时间需要 3 分钟。

题目描述:给定整数a1、a2、········、an,判断是否可以从中选出若干数,使他们的和恰好为k。

  分别输入n,a[1~n],k

  若是存在若干数的和恰为k,则输出YES, 否则 输出NO

限制条件:

1、1<=n<=20

2、-108<=ai<=108

3、-108<=k<=108

样例1

输入:4

   1 2 4 7

         13

输出:YES

源代码:

/*看到这个问题首先会想到穷举的办法,欲得到k数,则在n个数中的每一个数都有选择的机会,也就是说时间复杂度为2的n次方

好大的复杂度,我的第一反应是放弃这种方法,但是注意到限制条件中,对于数据量的限制,最大是20,即为2的20次方,
快速的换算下就是16的5次方,最多就是10的6次方,也就是说这个方法是可行的。*/
#include <stdio.h>
int a[25];
int k;
int n; //将其设为全局变量便于使用
bool dfs(int i, int sum) //分别表示当前函数的序号和前i个中的若干数的和
{
    if(i == n + 1) return sum == k;
    ///if(sum == k) return true; //若是前i个数就存在,后面的数,不用考虑直接输出ture
    if(dfs(i + 1, sum + a[i])) return true;//判断当前数存在的情况
    if(dfs(i + 1, sum)) return true; //判断当前数不存在的情况
    return false; //该情况不成立的情况
}
int main ()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d", &a[i]);
    }
    scanf("%d", &k);
    if(dfs(1, 0)) printf("YES\n");
    else printf("NO\n");
    return 0;
}

看起来这个更像是递归问题,而不是深搜问题。

当你理解这个程序流程后,会发现其实他是深搜。将一种情况走到底后,再次选择另一条路

转载于:https://www.cnblogs.com/momoing/p/5279758.html

你可能感兴趣的文章
一次性可以导入多少首歌曲到NoteBurner Spotify Music Converter中?
查看>>
基本shell脚本的编辑及变量
查看>>
$ORACLE_HOME/bin/oracle执行文件
查看>>
免密码登陆
查看>>
加密和解密 tar
查看>>
我的友情链接
查看>>
[李景山php]每天TP5-20161216|thinkphp5-helper.php-1
查看>>
VMware、Workstation 使用
查看>>
Windows Server 2012正式版RDS系列⑽
查看>>
The MySQL server has gone away
查看>>
freebsd上配置rsync服务
查看>>
Hibernate导出表代码
查看>>
用户输入和while循环
查看>>
keystone验证安装
查看>>
将datatable 保存为 Excel文件(高效率版本)
查看>>
C/C++五大内存分区(转)
查看>>
System V 共享内存区
查看>>
springmvc_1(hello world)
查看>>
0.随笔——读后感
查看>>
Linux基本安全措施、加强系统账号密码安全、系统引导和登录安全、用户切换、su、sudo、grub菜单...
查看>>