部分和问题 南阳acm1058(递归+dfs)
Posted -skyblue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部分和问题 南阳acm1058(递归+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
- 来源
- 经典题目
- 上传者
- TC_杨闯亮
- 简单的搜索问题,要注意它有多组测试数据
-
1 #include<stdio.h> 2 #include<string.h> 3 int a[22],b[22]; 4 int n,k,flag; 5 void dfs(int x,int sum) 6 { 7 int i; 8 if(sum > k) return; //此时不需要再相加了,已经超了 9 if(x==n) 10 { 11 if(sum == k) 12 { 13 flag = 1; 14 printf("YES "); 15 for(i=0; i<n; i++) 16 { 17 if(b[i]) printf("%d ",a[i]); 18 } 19 printf(" "); 20 return; 21 } 22 return; 23 } 24 b[x] = 0; 25 dfs(x+1,sum); //sum不需要+a[x]时,b[x] = 0 26 b[x] = 1; 27 dfs(x+1,sum+a[x]); //sum+a[x]时,b[x] = 1 28 } 29 int main() 30 { 31 int i; 32 while(scanf("%d%d",&n,&k)!=EOF) 33 { 34 flag = 0; 35 memset(b,0,sizeof(b)); 36 for(i=0; i<n; i++) 37 scanf("%d",&a[i]); 38 dfs(0,0); 39 if(!flag) 40 printf("NO "); 41 } 42 return 0; 43 }
以上是关于部分和问题 南阳acm1058(递归+dfs)的主要内容,如果未能解决你的问题,请参考以下文章