zoukankan      html  css  js  c++  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);

    输出

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

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

  • 相关阅读:
    <>跟!=
    exists查询中子表可以是
    in 与 = 的区别
    F查询和Q查询
    Django ORM常用字段和参数
    Django模板系统
    Djang视图层
    Django路由层
    ASP.NET前端语法应用
    WebConfig加密解密
  • 原文地址:https://www.cnblogs.com/eoooxy/p/6607898.html
Copyright © 2011-2022 走看看