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

ac代码:

#include<stdio.h>

#include<string.h>

int n,sum,s,bz;

int v[1000];//标记
int a[1000];

int num[1000];//记录输出数字
void dfs(int t)
{
    int i;
    if(s>=sum)
    {
    if(s==sum)
    {
        bz=1;
        printf("YES\n");
        for(i=0;i<n;i++)
        if(v[i])
        {
        printf("%d ",num[i]);
        }
    }
    return;
    }
    if(bz==1)
    return;
    for(i=t;i<n;i++)
    {
        s+=a[i];
        v[i]=1;//标记加入数字
        num[i]=a[i];
        dfs(i+1);
        s-=a[i];//回溯
        v[i]=0;
    }
}
int main()
{
    int i;
    while(~scanf("%d%d",&n,&sum))
    {
        bz=0;
        for(i=0;i<n;i++)
        scanf("%d",&a[i]);
        memset(v,0,sizeof(v));//初始化
        dfs(0);
        if(bz==0)
        printf("NO\n");
    }
    return 0;
} 




你可能感兴趣的:(NYOJ 1058部分和问题(dfs+回溯))