如 错误总金额为6
订单数据为 3,2,4,3,1
找出可能漏掉的订单(数组下标)
代码如下:
// err_sum 有错的和
// a 明细
// k 当前处理的位置
// cur_sum 前边的元素累加和
//b 记录取舍
public static void F(int err_sum, int[] a,int k, int cur_sum, boolean[] b) {
if(cur_sum > err_sum) return;//累加的金额已经超过错误金额
if(err_sum == cur_sum) {
for(int i=0;i<b.length;i++) {
if(b[i] == false) System.out.print( i + " ");
}
System.out.println();
return;
}
if(k >=a.length) return; //k超出a的范围
//注意出口顺序
b[k]=false;
F(err_sum,a,k+1,cur_sum,b);//不添加第K个元素
b[k]=true;
cur_sum += a[k];
F(err_sum,a,k+1,cur_sum,b);//添加第K个元素 第K个元素添加的情况已在此循环遍历完毕
b[k] = false;//回溯
}
public static void main(String[] args) {
int sum = 6;//错误的总金额
int[] a = {3,2,4,3,1};//账单数据
boolean[] b = new boolean[a.length];//a的对应项是否传入
F(6,a,0,0,b);
}
}
思路:判定分为两种 取该订单 与 不取该订单 并确定出口进行循环
注意:回溯!