算法训练 和为T
时间限制:1.0s 内存限制:256.0MB
问题描述
从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T。每个元素限选一次,不能一个都不选。
输入格式
第一行一个正整数n,表示整数集内元素的个数。
第二行n个整数,用空格隔开。
第三行一个整数T,表示要达到的和。
第二行n个整数,用空格隔开。
第三行一个整数T,表示要达到的和。
输出格式
输出有若干行,每行输出一组解,即所选取的数字,按照输入中的顺序排列。
若有多组解,优先输出不包含第n个整数的;若都包含或都不包含,优先输出不包含第n-1个整数的,依次类推。
最后一行输出总方案数。
若有多组解,优先输出不包含第n个整数的;若都包含或都不包含,优先输出不包含第n-1个整数的,依次类推。
最后一行输出总方案数。
样例输入
5
-7 -3 -2 5 9
0
-7 -3 -2 5 9
0
样例输出
-3 -2 5
-7 -2 9
2
-7 -2 9
2
数据规模和约定
1<=n<=22
T<=maxlongint
集合中任意元素的和都不超过long的范围
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 }