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

描述
给定整数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
来源
经典题目
上传者
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;
}




展开阅读全文

没有更多推荐了,返回首页