NYOJ 1058.部分和问题(深搜)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lisp1995/article/details/52310864
/*部分和问题
描述
    给定整数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

#include <stdio.h>
#include <string.h> 
int a[21];
bool b[21];
int n,k;
bool dfs(int i,int sum)//已经从前i项得到了和sum,然后对于i项之后的进行分支
{
	if(i==n)
		return sum==k;//如果前n项都计算过了,则返回sum是否与k相等
	if(dfs(i+1,sum))//不加上a[i]的情况
		return true;
	if(dfs(i+1,sum+a[i]))//加上a[i]的情况 
	{
		b[i]=true;
		return true;
	}
	return false;//无论是否加上a[i]都不能凑成k就返回false;
}
int main()
{
	int i;
	while(scanf("%d%d",&n,&k)!=EOF)
	{
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);
		memset(b,0,sizeof(b));
		if(dfs(0,0))
		{
			printf("YES\n");
			for(i=0;i<n;i++)
			{
				if(b[i])
					printf("%d ",a[i]);
			} 
			printf("\n"); 
		}
		else
			printf("NO\n"); 
	}
	return 0;
}


展开阅读全文

没有更多推荐了,返回首页