版权声明: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;//最后记得把之前试探过的回溯
}
}