问题:某财务部门结账时发现金额不对,很可能是从明细上漏掉了一笔或者几笔,如果已知明细账目清单,能通过编程找到漏掉的是哪1笔或者几笔吗?
如果有多种可能,则输出所有可能的情况
我们规定,用户输入的第一行是:有错的总金额。
接下来是一个整数n,所有可能漏掉的金额组合,每个情况1行,金额按照从小到大排列,中间用空间分开
比如:
用户输入:账目的明细
6
5
3
2
4 //我们把3,2,4,3,1相加之后大于6
3
1
表明:有错的总金额是6,明细共有5笔
此时,程序应该输出:有错的组合忘记加的
1 3 3
1 2 4
解决方法是:排列组合的问题
A B C D E F
漏掉的情况可能有 A E
A C F
A B C …
package mingxi;
public class Mingxi {
public static void f(int err_sum,int[] a,int k,int total_sum,boolean[] b)
//err_sum:错误的和;a[]明细原始数据;k:当前要考虑元素的位置;total_sum:当前已经累加的和
//b表示a的对应项是否选取,记录取舍
{
if(total_sum>err_sum) //当total_sum>err_sum的时候
return; //程序返回
if(err_sum==total_sum) { //错误明细和已累加的和相等
for(int i=0;i<b.length;i++) //第几项不取写出来
if(b[i]==false)
System.out.print(i+" "); //true的时候打印i
System.out.println();
return;
}
if(k>=a.length) //k超出数组范围
return;
//分为以下两种情况
b[k]=false; //假设b的第k项不取
f(err_sum,a,k+1,total_sum,b); //a[k]不加total中
b[k]=true; //假设b的第k项取
total_sum+=a[k]; //考虑a[k]是否要加在total_sum中
f(err_sum,a,k+1,total_sum,b); //得到的递归情况
b[k]=false; //回溯!!!;因为前面b取过true
}
public static void main(String[] args) {
int sum=6; //以6为例,怎样计算使得漏掉的数目相加等于6
int[] a= {3,2,4,3,1}; //明细账目,怎样经过相加计算才能和已知的和匹配
boolean[] b=new boolean[a.length]; //表示a的对应项是否选取
f(6,a,0,0,b); //参数传递
}
}
运行结果:
第一行:数组的0和2分别对应明细的3和4;去掉这两项相加为6
第二行:数组0 3 4去掉对应的这三项,相加结果为6.
第三行:…
以上我求的是第几项数据被漏掉