经典递归问题--少记了哪笔帐?error_money--Java实现

版权声明:071623 https://blog.csdn.net/weixin_43584220/article/details/88913652
package cn.LanQiaoBeiAlgorithm.Ravanla;
/**
 * 
 * @author Ravanlala
 * error_money是错误的累计金额,是其账单中少累计金额的总数
 * 现在想知道我这error_money是由那几笔账单加进去的
 *
 */
public class Error_Money {
	public static void main(String[] args) {
		int[] a = new int[] {3, 2, 4, 3, 1};
		boolean[] b = new boolean[a.length];
		f(6, a, 0, 0, b);
	}
	//error_money:错误的金额总和
	//a:账单明细
	//k:记录当前账目条数
	//current_money:当前累计
	//b:记录k指向的金额是否要加入当前累计的金额
	private static void f(int error_money, int[] a, int k, int current_money, boolean[] b) {
		if(current_money > error_money)return;
		if(current_money == error_money) {
			for(int i = 0; i < b.length; i++) {
				if(b[i] == false)System.out.print(i + " ");
				//把之前试探过的false全部打印出来
			}
			System.out.println();
			return;
		}
		if(k >= a.length)return;
		
		
		b[k] = false;//试探
		f(error_money, a, k + 1, current_money, b);
		
		b[k] = true;
		current_money+=a[k];//都是试探
		f(error_money, a, k + 1, current_money, b);
		//前面试探是在枚举完全数组,把数组中所有可以比较的可能列举出来
		b[k] = false;//最后记得把之前试探过的回溯
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43584220/article/details/88913652
今日推荐