部分和问题
时间限制:
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
-
思路分析:
-
此题可以用dfs进行搜索,递归求得。
-
参考代码:
-
#include<stdio.h> #include<string.h> int n,m,sum,v,a[100],b[100]; void dfs(int i) { if(sum>=m)//如果sum>m,不必再搜 { if(sum==m) { if(v) { v=0; printf("YES\n"); } for(int j=0;j<n;j++) { if(b[j])//当不等于零时输出 printf("%d ",a[j]); } printf("\n"); } return; } for(int j=i;j<n;j++)//利用dfs进行深搜 { sum+=a[j]; b[j]=1;//标记 dfs(j+1); sum-=a[j]; b[j]=0;//取消标记 } } int main() { while(~scanf("%d%d",&n,&m)) { v=1; for(int i=0;i<n;i++) scanf("%d",&a[i]); memset(b,0,sizeof(b)); sum=0; dfs(0);//从第一个开始搜索 if(v) printf("NO\n"); } return 0; }
-
首先,n和k,n表示数的个数,k表示数的和。