NYOJ 部分和问题

部分和问题

时间限制:1000 ms  |  内存限制:65535 KB

难度:2

输入

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

输出

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

样例输入

4 13
1 2 4 7

样例输出

YES
2 4 7

描述

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

采用回溯法解答,考虑到题目输出的限制,只有当数组中恰好存在和等于k的数对时,才更新hash数组。

#include <stdio.h>
#include <string.h>
#define MAX 100005

int arr[MAX];

int hash[MAX];

int n,k;
int flag=0;

int DFS(int i,int sum,int cnt)
{

    if(i==n)
    {
        if(sum==k&&cnt)
        {
            return 1;
        }
        return 0;
    }
    if(sum>k) return 0;
    //hash[i]=0;
    if(DFS(i+1,sum,cnt))
    {
        hash[i]=0;
        return 1;
    }
    if(DFS(i+1,sum+arr[i],cnt+1))
    {
        hash[i]=1;
        return 1;
    }
    return 0;
}

int main()
{
    while(scanf("%d %d",&n,&k)!=EOF)
    {
    int i,j;
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    memset(hash,0,sizeof(hash));
    if(DFS(0,0,0))
    {
        printf("YES\n");
        for(int i=0;i<n;i++)
        {
            if(hash[i]) printf("%d ",arr[i]);
        }
        printf("\n");
    }
    else printf("NO\n");
    }
}

猜你喜欢

转载自blog.csdn.net/chengsilin666/article/details/82289229
今日推荐