南阳理工---题目1058部分和问题

来源:互联网 发布:巴适公交暂无数据 编辑:程序博客网 时间:2024/05/22 10:55
描述
给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。
输入
首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
输出
如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
样例输入
4 131 2 4 7
样例输出
YES2 4 7
来源
经典题目
上传者
TC_杨闯亮

分析:这是一道简单的搜索问题,用的是DFS,从a[0]开始决定一个数加不加,需要画一个简单的二叉树的图,刚开始的时候sum=0;i=0;遇到DFS用到的就是递归,递归是搜索的基础。需要记录一下路径,用的是vis标记数组;代码如下:

#include<iostream>#include<stdio.h>#include<string.h>using namespace std;int i,j,k,n,sum=0;int vis[30];int a[30];bool dfs(int i,int sum){    if(i==n)        return sum==k;    if(dfs(i+1,sum))    return true;    if(dfs(i+1,sum+a[i]))    {      vis[i]=1;      return true;    }    return false;}int main(){    while(cin>>n>>k)    {        for(i=0;i<n;i++)            cin>>a[i];        memset(vis,0,sizeof(vis));        if(dfs(0,0))            printf("YES\n");        else            printf("NO\n");        for(i=0;i<n-1;i++)            if(vis[i])            printf("%d ",a[i]);            if(vis[i])            printf("%d\n",a[i]);    }    return 0;}




0 0
原创粉丝点击