关闭

NYOJ 1058部分和问题(dfs+回溯)

246人阅读 评论(0) 收藏 举报
分类:

部分和问题

时间限制: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;
} 




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    时刻记住--never give up
    人生如棋,吾愿为卒,吾行虽慢,谁曾见吾后退半步!
    个人资料
    • 访问:175434次
    • 积分:8646
    • 等级:
    • 排名:第2482名
    • 原创:723篇
    • 转载:3篇
    • 译文:0篇
    • 评论:27条