部分和问题 NYOJ1058 简单深搜

深入理解数据库原理
以实战为基础,以数据库原理为基础,结合实战,深入理解数据库原理。
wangxiaoming
NYOJ 1058 部分和问题 【DFS】

部分和问题

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述
给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。
输入
首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
输出
如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
样例输入
4 13
1 2 4 7
样例输出
YES

2 4 7


这里简单的Dp 其实 最开始最想的是怎么记录这个数据是否已经被计算了。。。 于是采用一个visit 数组记录 就可以将数字记录下来

实现代码:

#include<iostream>
#include<cstdio>
using namespace std;
const int max_n = 1000;
int k , n;
int num ;
int a[max_n];
int visit[max_n];
bool dfs(int i , int sum)
{
    if(i == n) return sum == k;
    //如果不加这个数和就到达了K那么返回true
    if(dfs(i + 1, sum))
    {
        visit[i] = 0;
         return true ;
    }

    //如果加上这个数和也k 那么返回true
    if(dfs(i+1, sum + a[i]))
    {
        visit[i] = 1;
        return true ;
    }
    return false;
}
void solve()
{
   if(dfs(0, 0))
   {
       printf("Yes\n");
       for( int j = 0 ;j <= n ; j++)
       {
           if(visit[j])
           {
               printf("%d ", a[j]);
           }
       }

   }
   else  printf("No\n") ;
}
int main()
{

    while(scanf("%d %d", &n, &k)== 2)
    {
        num = 0;
        for(int i = 0 ; i < n ; i++)
        {
            scanf("%d", &a[i]);
        }
        solve();
    }
    return 1;
}



wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值