递归法:财务金额漏掉1笔或者几笔(排列组合)

问题:某财务部门结账时发现金额不对,很可能是从明细上漏掉了一笔或者几笔,如果已知明细账目清单,能通过编程找到漏掉的是哪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.
第三行:…
以上我求的是第几项数据被漏掉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值