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);

输出

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

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

时间: 2024-12-28 16:50:54

java应用简单递归的相关文章

Atitit 表达式原理 语法分析&#160;原理与实践 解析java的dsl &#160;递归下降是现阶段主流的语法分析方法

Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析方法2 递归下降是现阶段主流的语法分析方法,2 于是我们可以把上面的语法改写成如下形式: 1)       Operator="+" | "-" | "*" | "/" 2)       Expression=<数字>

使用java搭建简单的ligerui环境

最近因为工作需要,学习了ligerui框架.但是,因为在公司,我们只是作为最低层的码农,所以环境都已经搭建好了,我们这些码农平时都是直接拿到工程,然后在别人的框架上不断的ctrl + c.ctrl + v,然后修修补补.所以为了摆脱这种困境,决定自己使用简单的servlet搭建一个ligerui,然后测试下ligerui这玩意到底是怎么跑起来的. 1.下载ligerui相关组件.这个很简单,直接去www.ligerui.com即可找到. 2.使用Eclipse创建一个web工程,然后搭建下面这个

Java中递归的优缺点,Java写一个递归遍历目录下面的所有文件包括子文件夹里边的文件。

题目: 遍历出aaa文件夹下的文件 首先分析思路: 1.首先判断这个文件夹是否为文件,通过isFile()函数可以判断是否为文件. 2.然后通过isDirectory判断是否为目录. 3.如果是目录就使用递归遍历目录 代码如下: 1 import java.io.File; 2 3 public class ZuoYe { 4 public static void main(String[] args) { 5 //创建file对象 6 File f=new File("d://新建文件夹&qu

Java数据类型简单总结

Java数据类型简单总结 一:Java数据类型总的分为两大类:基本数据类型和引用数据类型. 基本数据类型:byte.short.int.long.float.double.char.boolean八种. 引用数据类型: 1:除了基本数据类型之外都是引用数据类型, 2:API类:String.File 3:自定义类:Test01...... 4:数组:int [ ].String [ ] 二:基本数据类型 1:分类 数据类型 位(bit) 取值范围 数据类型 位 取值范围 byte 8 -128~

Java对象简单实用(计算器案例)

Java对象简单实用(计算器案例) 对 Java中的对象与属性,方法的使用,简单写了个案例 1 import java.util.Scanner; 2 class Calculste 3 { 4 int a; //定义两个整数 5 int b; 6 String option; //定义接收操作符的字符串 7 public void count(){ 8 9 //对操作符进行判断 10 switch(option){ 11 case "+": 12 System.out.println

Java实现简单版SVM

最近的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的. 之所以说是简单版,因为没有用到拉格朗日,对偶,核函数等等.而是用最简单的梯度下降法求解.其中的数学原理我参考了http://blog.csdn.net/lifeitengup/article/details/10951655,文中是用matlab实现的svm. 源代码和数据集下载:https://github.com/linger2012/simpleSvm 其中数据集来自于libsvm,我找了其中

java 的简单介绍

一.Java 特点     1.简单: 和C++相比较     2.面向对象     3.跨平台    由于它是先编译后解释 + JVM(屏蔽底层操作系统的差异) 二.程序的运行一般有两种:     1.编译  源文件 ------> 编译器  机器码文件       快  无法跨平台     2.解释  源文件 ------> 解释器  逐行翻译并运行   慢  可以跨平台 三.Java运行机制: 先编译,后解释     .java 源文件  -------> 编译器 .class 字

去掉有序数组中重复数字 原地 leetcode java (最简单的方法)

1.利用荷兰国旗的思路,每次记住最后一个位置,遇到一个不重复的数,放在它后面,代码很简单. Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for another array, you must do this in place with consta

java htmlparser 简单使用入门

请尊重本人的工作成果,转载请留言,并说明转载地址,谢谢.地址如下: http://blog.csdn.net/fukainankai/article/details/27710883 前几节中,我们利用GDI+在窗口中绘制了各种各样的图形.图像,这一节,我们将会将这些图像保存成简单图像.所谓简单图像,指的是bmp/jpg/png等图像或者单帧的gif图像.保存成多帧的gif图像稍微复杂一点,本节中暂时不做说明.保存成动态的tiff文件也比较简单,但这里也不做说明,下次有机会和gif一起介绍. 另