蓝桥杯——账单明细

package javaPractice;

/* 
 * (递归基础题)
 * 某财务部门结账时发现总金额不对头。很可能是从明细上漏掉了某1笔或几笔。 
 * 如果已知明细账目清单,能通过编程找到漏掉的是哪1笔或几笔吗? 
 * 如果有多种可能,则输出所有可能的情况。 
 * 我们规定:用户输入的第一行是:有错的总金额。 
 * 接下来是一个整数n,表示下面将要输入的明细账目的条数。 
 * 再接下来是n行整数,分别表示每笔账目的金额。 
 *  
 * 要求程序输出:所有可能漏掉的金额组合。每个情况1行。金额按照从小到大排列,中间用空格分开。 
 * 比如: 
 * 用户输入: 
	6 
	5 
	3 
	2 
	4 
	3 
	1 
表明:有错的总金额是6;明细共有5笔。 
此时,程序应该输出: 
    1 3 3 
    1 2 4 
    3 4 
    为了方便,不妨假设所有的金额都是整数;每笔金额不超过1000,金额的明细条数不超过100。 
 */  

import java.util.Scanner;

public class Contest15 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int sum = sc.nextInt();
		int n = sc.nextInt();
		int[] a = new int[n];
		boolean[] flag = new boolean[n];
		for(int i=0;i<n;i++) {
			a[i] = sc.nextInt();
		}		
		f(sum,0,a,0,flag);
		sc.close();
	}
	
	public static void f(int sum,int k,int[] a,int cur_sum,boolean[] flag) {
		if(sum < cur_sum) {
			return ;
		}
		if(sum == cur_sum) {
			for(int i=0;i<flag.length;i++) {
				if(flag[i]) {
					System.out.print(a[i]+" ");
				}
			}
			System.out.println();
			return;
		}
		
		if(k >= a.length) {
			return ;
		}
		
		flag[k] = false;
		f(sum,k+1,a,cur_sum,flag);
		flag[k] = true;
		cur_sum = cur_sum + a[k];
		
		f(sum,k+1,a,cur_sum,flag);
		flag[k] = false;//亲娘嘞 一定要记得回溯了!!!
	}
}

猜你喜欢

转载自blog.csdn.net/Moliay/article/details/87890105
今日推荐