zoukankan      html  css  js  c++  java
  • 7.13dfs例题:部分和

    部分和:
    给定整数序列a1,a2,...,an,判断是否可以从中选出若干数,使它们的和恰好为k.

    样例:
        输入
            n=4
            a={1,2,4,7}
            k=13
        输出
      Yes (13 = 2 + 4 + 7)

    思路:
    已有n个数字,用数组a存放,变量cur从指向第0个下标元素开始不断往后扫描数组,这个时候有两种选择状态:
    1.不要当前元素,cur+1继续递归。
    2.要当前元素,放入ArrayList集合中记录曾经选了那个元素,我们的k减去a[cur]当前元素值,继续往后扫描cur+1,这里还得退回到平行状态,回溯操作remove(a.size()-1)。
    3.出口,如果k < 0 或者 cur == a.length时直接return,如果k == 0代表ArrayList集合里的元素刚好凑齐k,直接打印输出。

     1 import java.util.ArrayList;
     2 import java.util.Scanner;
     3 
     4 public class Seven_13dfs竞赛题部分和 {
     5     static int kk;
     6     private static void dfs(int[] a, int k, int cut, ArrayList<Integer> ints){
     7         if(k == 0){
     8             System.out.print("Yes ("+kk+" = ");
     9             for(int i = 0; i < ints.size(); i++){
    10                 System.out.print(ints.get(i)+(i==ints.size()-1 ? "" : " + "));
    11             }
    12             System.out.println(")");
    13         }
    14         if(k < 0 || cut == a.length)
    15             return;
    16         
    17         //不要的情况
    18         dfs(a, k, cut+1, ints);
    19         
    20         //要的情况
    21         ints.add(a[cut]);
    22         int index = ints.size()-1;
    23         dfs(a, k-a[cut], cut+1, ints);
    24         ints.remove(index);
    25     }
    26     public static void main(String[] args) {
    27         Scanner in = new Scanner(System.in);
    28         int n = in.nextInt();
    29         int[] a = new int[n];
    30         for(int i = 0; i < n; i++){
    31             a[i] = in.nextInt();
    32         }
    33         int k = in.nextInt();
    34         kk = k;
    35         dfs(a, k, 0, new ArrayList<Integer>());
    36     }
    37 }
  • 相关阅读:
    mysql数据库(12)--进阶二之索引
    mysql数据库(11)--进阶一之join
    mysql数据库(10)--变量、存储过程和函数
    mysql数据库(9)--视图
    mysql数据库(10)--limit与offset的用法
    前端常用在线引用地址
    SQL中ON和WHERE的区别
    jstl和e1
    解决中文乱码问题
    JSP
  • 原文地址:https://www.cnblogs.com/z1110/p/12609555.html
Copyright © 2011-2022 走看看