NYOJ1058

来源:互联网 发布:java语言 编辑:程序博客网 时间:2024/06/14 03:55


部分和问题

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述
给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。
输入
首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
输出
如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
样例输入
4 131 2 4 7
样例输出
YES2 4 7

#include <stdio.h>  int n, k, ok, arr[22], vis[22], count;  //ok用来标记是否成功 void dfs(int pos){ //pos代表第几个数为位置     if(count >= k){          if(count == k){                  ok = 1;//在此处标记已经成功 printf("YES\n");               for(int i = 0; i < n; ++i){                if(vis[i]) printf("%d ", arr[i]); }            printf("\n");          }        }            for(int i = pos; i < n; ++i){          count += arr[i];//先试着将这个数加上去          vis[i] = 1;          dfs(i + 1);          count -= arr[i];//不满足情况时就去掉          vis[i] = 0;      }      } int main(){      while(scanf("%d%d", &n, &k) == 2){          ok = 0;          for(int i = 0; i < n; ++i){              scanf("%d", &arr[i]);             vis[i] = 0;          }          count = 0; dfs(0);          if(!ok) printf("NO\n");      }      return 0;  }  


原创粉丝点击