算法基础_递归_寻找缺漏项

题目如下(原题不是这样,我自己浓缩了下/捂脸,原题目太绕了)

/**
 * 先输入一个数,表示和,再输入一个数,表示数据的项数,然后输入上一个数字那么多个的数字
 * 所要做的事情,在输入的数字中挑选若干个数字,这些数字的和凑成第一个数字,然后打印出每次未用到的数字
 * @author Administrator
 *
 */

解题源代码如下:

import java.util.Scanner;

/**
 * 先输入一个数,表示和,再输入一个数,表示数据的项数,然后输入上一个数字那么多个的数字
 * 所要做的事情,在输入的数字中挑选若干个数字,这些数字的和凑成第一个数字,然后打印出每次未用到的数字
 * @author Administrator
 *
 */
public class Demo08 {
    public static void f(int err_sum,int[] a,int ini,int cur_sum,boolean[] flag) {
        if(cur_sum>err_sum)return;
        if(cur_sum==err_sum) {
            for(int i = 0;i<a.length;i++) {
                if(!flag[i]) {
                    System.out.print(a[i]+" ");
                }
            }
            System.out.println();
            return;
        }
        if(ini>=a.length)return;
        flag[ini] = false;//初始化
        f(err_sum,a,ini+1,cur_sum,flag);
        flag[ini] = true;
        cur_sum+= a[ini];
        f(err_sum,a,ini+1,cur_sum,flag);
        flag[ini] = false;//回溯
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int err_sum = sc.nextInt();
//        int err_sum = 6;
        int size = sc.nextInt();
//        int a[] = {3,2,1,3,4};
        int a[] = new int[size];
        for(int i = 0;i<size;i++) {
            a[i] = sc.nextInt();
        }
        boolean[] flag = new boolean[a.length];
        f(err_sum,a,0,0,flag);
    
    }
    
}

解题思路:

这里说一个小技巧吧,就是递归算法在很难解决的时候,可以考虑一下增加传入参数,可能问题就迎刃而解了

本题解决方法的主要思想就是:游标先定位在最后一个,然后一个一个往前移动,每移一次就把后面的数字在遍历一遍,如果有符合条件的,就打印出来

如果超出了接线的,就return就好

希望对大家有所帮助

以上

猜你喜欢

转载自www.cnblogs.com/lavender-pansy/p/10544628.html