NYOJ 1058 部分和问题(dfs)

来源:互联网 发布:员工管理系统数组java 编辑:程序博客网 时间:2024/06/06 01:35

题目:NYOJ 1058 部分和问题

好吧,简单的深度搜索

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <stack>using namespace std;int num[25],vis[25];int flag,n,k;void dfs(int m,int sum){    if(sum>k)        return ;    if(sum==k)    {        if(flag)            return ;        flag=1;        printf("YES\n");        for(int i=0;i<n;i++)            if(vis[i])                printf("%d ",num[i]);        printf("\n");        return ;    }    for(int i=m;i<n;i++)    {        sum+=num[i];        vis[i]=1;        dfs(i+1,sum);        sum-=num[i];        vis[i]=0;    }}int main(){    while(scanf("%d %d",&n,&k)!=EOF)    {        memset(vis,0,sizeof(vis));        int i;        for(i=0;i<n;i++)            scanf("%d",&num[i]);        flag=0;        dfs(0,0);        if(!flag)            printf("NO\n");    }    return 0;}