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

情景: 类似于给定一个数字,算他由多少个数字组成,比如: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); //
list2.add(1); //
list2.add(20); //
list2.add(50); //
list2.add(1000); //

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

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应用简单递归的更多相关文章

  1. Java中的递归运算

    Java中的递归运算是一种在自己的方法内部调用自己的方法 递归的设计思想是:把一个复杂的问题,分解为若干个等同的子问题,重复执行,直到之问题能够简单到直接求解,这样复杂的问题就得以解决. 递归运算有两 ...

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

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

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

    题目: 遍历出aaa文件夹下的文件 首先分析思路: 1.首先判断这个文件夹是否为文件,通过isFile()函数可以判断是否为文件. 2.然后通过isDirectory判断是否为目录. 3.如果是目录就 ...

  4. Java实现简单版SVM

    Java实现简单版SVM 近期的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的.         之所以说是简单版,由于没实用到拉格朗日,对偶,核函数等等.而 ...

  5. java实现简单的单点登录

    java实现简单的单点登录 摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现 ...

  6. Java自定义简单标签

     Java自定义简单标签可以方便的在页面输出信息,并且对于权限的控制,和对于Jsp标签和servlet代码的分离有着很好的作用. 下面将以权限的控制为例自定义一个标签: 一.标签类型 <wxt: ...

  7. 主题:Java WebService 简单实例

    链接地址:主题:Java WebService 简单实例    http://www.iteye.com/topic/1135747 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...

  8. java设计模式--简单工厂

    java设计模式--简单工厂 简单工厂不是一个标准的设计模式,但是很常用需要掌握. 在java应用开发中,要"面向接口编程". 1.java中接口的概念: 在java中接口是一种特 ...

  9. JAVA实现简单的四则运算

    GitHub 项目地址 https://github.com/745421831/-/tree/master PSP PSP2.1 Personal Software Process Stages 预 ...

随机推荐

  1. 【Python】【爬虫】如何学习Python爬虫?

    如何学习Python爬虫[入门篇]? 路人甲 1 年前 想写这么一篇文章,但是知乎社区爬虫大神很多,光是整理他们的答案就够我这篇文章的内容了.对于我个人来说我更喜欢那种非常实用的教程,这种教程对于想直 ...

  2. Laravel 5.* 中路由绑定 Controller 包含子目录写法

    https://blog.csdn.net/maxsky/article/details/54017981 [可以使用命令在项目根目录一键创建 php artisan make:controller ...

  3. [py]python中__new__作用

    元类metaclass 使劲搞,但是没搞清楚__new__的作用 了解Python元类 Python进阶:一步步理解Python中的元类metaclass Python中的__new__和__init ...

  4. JDBC连接数据库(一)

    原文地址http://www.cnblogs.com/hongten/archive/2011/03/29/1998311.html JDBC连接数据库 创建一个以JDBC连接数据库的程序,包含7个步 ...

  5. mutex锁住共用线程函数 造成了死锁 ,为什么?

    锁住共用的线程函数,为什么出现了死锁的现象,是真的死锁了吗?为什么勒[清晰早点] [逍遥游]# 一般都是用 EnterCriticalSection 和 LeaveCriticalSection 锁住 ...

  6. cocos代码研究(18)Widget子类Slider学习笔记

    理论基础 滑动条控件. 代码实践 实例: // Create the slider Slider* slider = Slider::create(); slider->loadBarTextu ...

  7. Python 3 并发编程多进程之进程池与回调函数

    Python 3 进程池与回调函数 一.进程池 在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.多进程是实现并发的手段之一,需要注意 ...

  8. Linux内核分析 02

    二,操作系统是如何工作的 1.函数调用堆栈 三大法宝:存储程序计算机 函数调用堆栈 中断机制 堆栈:是C语言程序运行时必须的一个记录调用路径和参数的空间.是计算机内部现成的东西,我们直接使用. 包括函 ...

  9. ZooKeeper增加Observer部署模式提高性能(转)

    除了Leader和Follow模式之外,还有第三种模式:Observer模式. Observer:在不伤害写性能的情况下扩展ZooKeeper. 虽然通过Client直接连接到ZooKeeper集群的 ...

  10. springboot2 统一返回结果

    统一返回结果是说,不用在controller层,new一个对象,或用工厂创建这个对象,再返回这个对象,而是这个Action该返回什么就返回什么, 我们再通过mvc的流程,再对返回对象做进一步的封装,以 ...