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); //
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应用简单递归的更多相关文章
- Java中的递归运算
Java中的递归运算是一种在自己的方法内部调用自己的方法 递归的设计思想是:把一个复杂的问题,分解为若干个等同的子问题,重复执行,直到之问题能够简单到直接求解,这样复杂的问题就得以解决. 递归运算有两 ...
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...
- Java中递归的优缺点,Java写一个递归遍历目录下面的所有文件包括子文件夹里边的文件。
题目: 遍历出aaa文件夹下的文件 首先分析思路: 1.首先判断这个文件夹是否为文件,通过isFile()函数可以判断是否为文件. 2.然后通过isDirectory判断是否为目录. 3.如果是目录就 ...
- Java实现简单版SVM
Java实现简单版SVM 近期的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的. 之所以说是简单版,由于没实用到拉格朗日,对偶,核函数等等.而 ...
- java实现简单的单点登录
java实现简单的单点登录 摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现 ...
- Java自定义简单标签
Java自定义简单标签可以方便的在页面输出信息,并且对于权限的控制,和对于Jsp标签和servlet代码的分离有着很好的作用. 下面将以权限的控制为例自定义一个标签: 一.标签类型 <wxt: ...
- 主题:Java WebService 简单实例
链接地址:主题:Java WebService 简单实例 http://www.iteye.com/topic/1135747 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...
- java设计模式--简单工厂
java设计模式--简单工厂 简单工厂不是一个标准的设计模式,但是很常用需要掌握. 在java应用开发中,要"面向接口编程". 1.java中接口的概念: 在java中接口是一种特 ...
- JAVA实现简单的四则运算
GitHub 项目地址 https://github.com/745421831/-/tree/master PSP PSP2.1 Personal Software Process Stages 预 ...
随机推荐
- SAP GUI常用快捷键
F1:帮助 F2:双击.比如TC行的双击,LIST行的双击等 F3:后退(Back),后退按钮 Shift+F3:退出(Exit),退出按钮 F4:搜索帮助 F8:执行 F10:菜单 F12:取消(C ...
- mybatis 中jdbctype和javatype的对应关系
1:mybatis 中jdbctype和javatype的对应关系 JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String ...
- oracle 死锁查询及处理
SELECT bs.username "Blocking User", bs.username "DB User", ws.userna ...
- mydumper原理介绍
mydumper的安装:http://www.cnblogs.com/lizhi221/p/7010174.html mydumper介绍 MySQL自身的mysqldump工具支持单线程 ...
- 数值积分:基于牛顿-柯茨公式的定步长和自适应积分方法 [MATLAB]
#先上代码后补笔记# #可以直接复制粘贴使用的MATLAB函数!# 1. 定步长牛顿-柯茨积分公式 function [ integration ] = CompoInt( func, left, r ...
- la3523 白书例题 圆桌骑士 双联通分量+二分图
具体题解看大白书P316 #include <iostream> #include <algorithm> #include <vector> #include & ...
- Java Character 类
Character 类用于对单个字符进行操作. Character 类在对象中包装一个基本类型 char 的值 实例 char ch = 'a'; // Unicode 字符表示形式 char uni ...
- 2017-2018-2 20165207实验二《Java面向对象程序设计》实验报告
2017-2018-2 20165207实验二<Java面向对象程序设计>实验报告 课程:Java程序设计 班级:1652 姓名:李天林 学号:20165207 实验日期:2018年4月1 ...
- bzoj1610 / P2665 [USACO08FEB]连线游戏Game of Lines
P2665 [USACO08FEB]连线游戏Game of Lines 第一次写快读没判负数....(捂脸) 暴力$O(n^2)$求斜率,排序判重. 注意垂直方向的直线要特判. end. #inclu ...
- 20155201 实验四《Java面向对象程序设计》实验报告
20155201 实验四<Java面向对象程序设计>实验报告 一.实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局 ...