部分和问题
时间限制:
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
-
首先,n和k,n表示数的个数,k表示数的和。
思路:从第一个开始加,直到大于等于k。判断是否等于K,不等于就返回上一层。加下一个数。依次循环。直到找完所有的数。
#include<stdio.h> #include<string.h> int flag,sum,n,k; int a[30]; int vis[30]; void DFS(int pos) { if(flag==1) return ;//找到后逐层返回 if(sum>=k) { if(sum==k)//相等后标记并输出 { flag=1; printf("YES\n"); for(int i=0;i<n;i++)//输出 if(vis[i]==1) printf("%d ",a[i]); printf("\n"); } return ; //节约时间 (大于k之后就不用再相加了) } for(int i=pos;i<n;i++) { sum=sum+a[i]; //一个一个相加 vis[i]=1; //标记 DFS(i+1); //寻找下一个 sum=sum-a[i]; //返回前一个 vis[i]=0; //清除标记 } } int main() { while(~scanf("%d%d",&n,&k)) { sum=0; memset(vis,0,sizeof(vis));//初始化标记 for(int i=0;i<n;i++) scanf("%d",&a[i]); flag=0;//用来标记并输出 YES or NO DFS(0); if(flag==0) printf("NO\n"); } return 0; }