部分和问题

来源:互联网 发布:淘宝图片怎么拍摄技巧 编辑:程序博客网 时间:2024/06/07 09:05

部分和问题

描述

给定整数a1、a2、…….an,判断是否可以从中选出若干数,使它们的和恰好为K。

输入

首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)

输出

如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
样例输入

4 131 2 4 7

样例输出

YES2 4 7

解析:

题目坑:

题目上没有给出要输出所有的和等于K的情况

代码

#include <stdio.h>int n, k, ok, arr[22], vis[22], count;void DFS(int pos){    if(count >= k)    {        if(count == k)      //如果刚好等于就输出        {            if(!ok)         //判断之前是否出现过;            {                ok = 1;                printf("YES\n");            }            for(int i = 0; i < n; ++i)                if(vis[i]) printf("%d ", arr[i]);            printf("\n");        }                   //大于就结束,回溯;        return;    }    for(int i = pos; i < n; ++i)        {        count += arr[i];        vis[i] = 1;        DFS(i + 1);        count -= arr[i];        vis[i] = 0;    }}int main(){    while(scanf("%d%d", &n, &k) == 2)    {        ok = 0;        for(int i = 0; i < n; i++)        {            scanf("%d",&arr[i]);            vis[i] = 0;        }        count = 0;        DFS(0);        if(!ok)             //没有刚好等于k的;            printf("NO\n");    }    return 0;}
原创粉丝点击