[递归][dfs]财务金额漏掉1笔或者几笔(漏掉的账目明细)

[递归][dfs]财务金额漏掉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 …

erro_sum:错误的账目总金额
now_sum:累加时的金额
a:账目清单各项金额
k:深搜当前位置
b:用于记录是否标记了金额的数组

public class dfs {
    public static void f(int erro_sum,int[]a,int k,int now_sum,boolean[]b) {
     if(erro_sum<now_sum)return;//累加的账目数大于错误帐则返回
     if(erro_sum==now_sum) {//如果累加的帐与错误帐相等,即达到目标,输出其余未标记的账目金额对应的位置即可
      for(int i=0;i<a.length;i++) 
       if(b[i]==false) 
        System.out.println(i);//输出未标记元素位置
                 System.out.println();
                 return;}
     if(k>a.length-1)return;//若k超出了a数组长度则返回
      b[k]=false;//深搜情况1:假设k位置不取
     f(erro_sum,a,k+1,now_sum,b);//继续往下搜索
     b[k]=true;//深搜情况2:假设取k位置
     now_sum+=a[k];//将k位置对应的金额累加至now_sum
     f(erro_sum,a,k+1,now_sum,b);//继续往下搜索
     b[k]=false;//回溯
    }
 public static void main(String[] args) {
  // TODO 自动生成的方法存根
  int erro_sum=6;
        int[]a= {3,2,4,3,1};
        boolean[]b=new boolean[a.length];
        f(erro_sum,a,0,0,b);
 }
 }

结果

02
034
124
23

若有不对望大牛指点谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值