部分和问题
时间限制:
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
来源
- 经典题目 上传者
根据深搜特点,用递归函数较容易实现,在此题中耗时较大,不过题目数据较小,不会超时。
#include<stdio.h> int n,k,x; int a[22],b[22]; int main() { bool dfs(int i,int sum); while(~scanf("%d%d",&n,&k)){ x=0; for(int i=0;i<n;i++) scanf("%d",&a[i]); if(dfs(0,0)){ printf("YES\n"); printf("%d",b[x-1]);//递归存的数,先存的是最后一个数,所以要逆序输出。 for(int i=x-2;i>=0;i--) printf(" %d",b[i]); printf("\n"); } else printf("NO\n"); } return 0; } bool dfs(int i,int sum) { if(i==n) return sum==k;//判断sum是否等于k。 //这里是先判断不加当前a[i]时sum是否等于k值。 if(dfs(i+1,sum))return true;//这里i是从1开始,而数组是从0开始,所以i+1。 //再判断加上当前a[i]的值时,sum与k关系。 if(dfs(i+1,sum+a[i])) { b[x++]=a[i];//需要加的a[i]就是要找的数其中一个,用一个数组存起来。 return true; } return false; }
为了让更多像我一样的菜鸟能看懂(其实我是复习用),画了老半天的图
-
首先,n和k,n表示数的个数,k表示数的和。