蓝桥杯 算法训练 ALGO-115 和为T

算法训练 和为T  
时间限制:1.0s   内存限制:256.0MB
问题描述
  从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T。每个元素限选一次,不能一个都不选。
输入格式
  第一行一个正整数n,表示整数集内元素的个数。
  第二行n个整数,用空格隔开。
  第三行一个整数T,表示要达到的和。
输出格式
  输出有若干行,每行输出一组解,即所选取的数字,按照输入中的顺序排列。
  若有多组解,优先输出不包含第n个整数的;若都包含或都不包含,优先输出不包含第n-1个整数的,依次类推。
  最后一行输出总方案数。
样例输入
5
-7 -3 -2 5 9
0
样例输出
-3 -2 5
-7 -2 9
2
数据规模和约定
  1<=n<=22
  T<=maxlongint
  集合中任意元素的和都不超过long的范围
 
示例代码:
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStreamReader;
 4 
 5 public class Main {
 6     static int sum = 0 ;
 7     static int n = 0 ;
 8     static int l = 0 ;     //b数组存的数的个数
 9     static int count = 0 ;
10     static int[] a = new int[23];
11     static int[] b = new int[23];
12     
13     public static void main(String[] args) throws IOException {
14         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
15         n = Integer.parseInt(br.readLine());
16         String[] str = br.readLine().split(" ");
17         a = new int[n];
18         for(int i = n-1 ; i >= 0 ; i-- ){
19             a[i] = Integer.parseInt(str[n-i-1]);
20         }
21         sum = Integer.parseInt(br.readLine());
22         
23         f(0,0);
24         
25         System.out.println(count);
26     }
27 
28     private static void f(int k, long z) {
29         int i;
30         if (k==n)
31         {
32             if (z==sum&&l!=0)                      //如果z等于sum,并且从a数组取到一个数,就就将结果输出
33             {
34                    for (i=l-1;i>=0;i--)
35                        System.out.print(b[i]+" ");
36                    count++;                           //记录一次方案
37                    System.out.println();
38             }
39             return;                                //返回上一层
40         }
41         f(k+1,z);           //k:从a取数的下标
42         b[l++]= a[k];       //将取的数存入b数组,并将l后移
43         f(k+1,z+a[k]);      //调用新的k 和 b数组中的累加和
44         l--;                
45         
46     }    
47 }

 

posted @ 2017-03-16 21:53  C3Stones  阅读(1045)  评论(0编辑  收藏  举报