• 蓝桥杯 算法训练 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 }
  • 相关阅读:
    第一个C#程序
    定位网页元素
    盒子模型
    浮动
    css3美化网页元素
    html css3
    java表单基础
    表单
    html5基础
    java程序题目解析
  • 原文地址:https://www.cnblogs.com/cao-lei/p/6561829.html
Copyright © 2020-2023  润新知