zoukankan      html  css  js  c++  java
  • 蓝桥杯 算法训练 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 }
  • 相关阅读:
    hdoj 2803 The MAX【简单规律题】
    hdoj 2579 Dating with girls(2)【三重数组标记去重】
    hdoj 1495 非常可乐【bfs隐式图】
    poj 1149 PIGS【最大流经典建图】
    poj 3281 Dining【拆点网络流】
    hdoj 3572 Task Schedule【建立超级源点超级汇点】
    hdoj 1532 Drainage Ditches【最大流模板题】
    poj 1459 Power Network【建立超级源点,超级汇点】
    hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】
    hdoj 1012 u Calculate e
  • 原文地址:https://www.cnblogs.com/cao-lei/p/6561829.html
Copyright © 2011-2022 走看看