首页 > 代码库 > java应用简单递归

java应用简单递归

毕业后就怎么学过算法,还在上学的时候学过数据结构,现在基本上都还给老师了,可惜老师学费没有还给我。。。

情景: 类似于给定一个数字,算他由多少个数字组成,比如:36 现在有10、5、1 ,那么最佳帅3个10,1个5,1个1组成(默认优先取最大)。因为我们这边业务上面需要开发票,有的时候不想一个一个算,就让我们写一个。但是他发票的个数不是固定的、无尽的,所以每次就要判断下,如果:36 现在基数还是10、5、1 但是 只让你拿1个10、2个5、若干个1,那么组合应该是:1个10,2个5,16个1,大概就是这个意思。

添加两个list,一个存放基数(从大到小)另外一个存放基数的对应个数。

     List list = new ArrayList();
        list.add(10);
        list.add(100);
        list.add(1);
        list.add(20);
        list.add(50);
        list.add(5);
        Collections.sort(list, Collections.reverseOrder());
        List list2 = new ArrayList(); 
        list2.add(1);  //100对应个数(下同)
        list2.add(4); //50
        list2.add(1); //20
        list2.add(20); //10
        list2.add(50); //5
        list2.add(1000); //1

下面就是递归了。。没有啥难度。。参数分别是: 输入的总数,集合的初始下标,基数集合,基数个数集合

public void c(int totle, int flag, List list, List list2) {
        //System.out.println("当前总额" + totle + ",当前额度" + list.get(flag));
        int sum = 0;
        for (int i = 0; i < list.size(); i++) {
            sum += (int) list.get(i) * (int) list2.get(i);
        }
        if (sum < totle) {
            System.out.println("发票总额不够,请添加发票!!!!");
        } else {
            if (totle % (int) list.get(flag) == 0) {
                int s = totle / (int) list.get(flag);
                //System.out.println(s + "");
                if (s > (int) list2.get(flag)) {
                    System.out.println("需要" + list.get(flag) + "元的发票" + s + "张,目前只有" + list2.get(flag) + "张,全部使用!");
                    totle -= (int) list2.get(flag) * (int) list.get(flag);
                    System.out.println(totle);
                    c(totle, ++flag, list, list2);
                } else {
                    System.out.println("需要" + list.get(flag) + "元的发票" + s + "张");
                }

            } else {
                int s = totle / (int) list.get(flag);
                if (s > (int) list2.get(flag)) {
                    System.out.println("需要" + list.get(flag) + "元的发票" + s + "张,目前只有" + list2.get(flag) + "张,全部使用!");
                    totle -= (int) list2.get(flag) * (int) list.get(flag);
                    System.out.println(totle);
                    c(totle, ++flag, list, list2);
                } else {
                    totle = totle % (int) list.get(flag);
                    System.out.println("需要" + list.get(flag) + "元的发票" + s + "张");
                    System.out.println(totle);
                    c(totle, ++flag, list, list2);
                }

            }
        }
    }

假设:

c(365, 0, list, list2);

输出

技术分享

如果输入超过所有的总额,那么如下:

技术分享

 

很简单,记录一下,也是提醒下自己,算法也是蛮重要的。。。没事也要跟着慢慢研究!!! 

 

java应用简单递归