java找零钱_求一共有多少种方式系列问题(找零钱)
求一共有多少种方式系列问题(找零钱问题)
背景:
假设有四种面额的钱币
1 元、2 元、5 元和 10 元,一共给我 10 元
那您可以奖赏我 1 张 10 元,或者 10 张 1 元
或者 5 张 1 元外加 1 张 5 元等等
如果考虑每次奖赏的金额和先后顺序
那么最终 一共有多少种不同的奖赏方式呢?
看到了一个这样的问题,想用java代码解决一下
本方案用到了递归的方式计算
下面用java代码做了个实现
考虑每次奖赏的金额和先后顺序
public class allprobability {
public static void main(string [] args){
//设置数额
int a = 10;
get(a,"");
system.out.println("over");
}
private static int m = 0;
/**
* 计算后面可能发生的概率
* @param num 剩余
* @param s 缓冲字符串
*/
private static void get(int num ,string s){
//0 直接输出
if(num == 0) system.out.println("第"+(++m)+"种方法"+s);
//1
if(num>=1){
get(num-1,s+" "+1);
}
//2
if(num>=2){
get(num-2,s+" "+2);
}
//5
if(num>=5){
get(num-5,s+" "+5);
}
//10
if(num>=10){
get(num-10,s+" "+10);
}
}
}
以上代码输出结果为:
第1种方法 1 1 1 1 1 1 1 1 1 1
第2种方法 1 1 1 1 1 1 1 1 2
第3种方法 1 1 1 1 1 1 1 2 1
......
第127种方法 5 2 2 1
第128种方法 5 5
第129种方法 10
over
真的不做不知道一做吓一跳啊 才数字10就有这么多结果
考虑重复
我又加了个info类
这里面存着4种货币的数量和一个缓存的num值
import java.util.linkedlist;
import java.util.list;
public class allprobability2{
/** 结果 **/
private static list infos = new linkedlist<>();
public static void main(string [] args){
//设置数额
get(new info(10));
system.out.println("over");
}
private static int m = 0;
private static void get(info s){
int num = s.getnum();
//0 直接输出
if(s.getnum() == 0) {
if (!s.hasit())system.out.println("第"+(++m)+"种方法 "+s);
}
//1
if(s.getnum()>=1){
get(s.cp().add(1).setnum(num-1));
}
//2
if(num>=2){
get(s.cp().add(2).setnum(num-2));
}
//5
if(num>=5){
get(s.cp().add(5).setnum(num-5));
}
//10
if(num>=10){
get(s.cp().add(10).setnum(num-10));
}
}
//将结果封装为一个结果类
static class info{
public info(int num){this.num = num;}
public info(int a1, int a2, int a5, int a10) {
this.a1 = a1;
this.a2 = a2;
this.a5 = a5;
this.a10 = a10;
}
int num,a1,a2,a5,a10 = 0;
public boolean hasit(){
for (info i : infos){
if(i.equals(this))return true;
}
infos.add(this);
return false;
}
public int getnum(){return this.num;}
public info setnum(int num){this.num = num;return this;}
public info cp(){
return new info(this.a1,this.a2,this.a5,this.a10);
}
public info add(int a){
if(a==1)a1++;
if(a==2)a2++;
if(a==5)a5++;
if(a==10)a10++;
return this;
}
@override
public boolean equals(object o) {
if (this == o) return true;
if (o == null || getclass() != o.getclass()) return false;
info info = (info) o;
if(!(this.a1==info.a1))return false;
if(!(this.a2==info.a2))return false;
if(!(this.a5==info.a5))return false;
if(!(this.a10==info.a10))return false;
return true;
}
@override
public string tostring() {
return"1元的:"+a1+"个,2元的"+ a2+"个,5元的"+a5+"个,10元的"+a10+"个";
}
}
}
这一次输出结果
第1种方法 1元的:10个,2元的0个,5元的0个,10元的0个
第2种方法 1元的:8个,2元的1个,5元的0个,10元的0个
第3种方法 1元的:6个,2元的2个,5元的0个,10元的0个
第4种方法 1元的:5个,2元的0个,5元的1个,10元的0个
第5种方法 1元的:4个,2元的3个,5元的0个,10元的0个
第6种方法 1元的:3个,2元的1个,5元的1个,10元的0个
第7种方法 1元的:2个,2元的4个,5元的0个,10元的0个
第8种方法 1元的:1个,2元的2个,5元的1个,10元的0个
第9种方法 1元的:0个,2元的5个,5元的0个,10元的0个
第10种方法 1元的:0个,2元的0个,5元的2个,10元的0个
第11种方法 1元的:0个,2元的0个,5元的0个,10元的1个
over
考虑完重复结果 只有11种办法 相比之前的确实少了不少
希望与广大网友互动??
点此进行留言吧!
java找零钱_求一共有多少种方式系列问题(找零钱)相关推荐
- java 制作自定义控件_自定义控件的三种方式
文章转载于https://blog.csdn.net/fictionss/article/details/78285167 原生控件,自己绘制和继承原生控件. 1.组合原生控件 将自己需要的控件组合起 ...
- 用10元,20元,50元三种币值的纸币凑出1000元,一共有多少种组合(C++实现)三种思路,两种实现
今天做了中金所的笔试题,被一道题卡住了.题目意思是: 用10元,20元,50元三种币值的纸币凑出1000元,一共有多少种组合? 当时一眼看上去分析了一下,以为是背包问题,类似于爬楼梯,于是直接带了爬楼 ...
- TSP问题中:如果有n个顶点,那么一共有多少种不同的环游
如果有n个顶点,那么一共有多少种不同的环游? 答: (n−1)!2\frac{(n-1)!}{2}2(n−1)! 1.首先是全排列n!n!n!,然后由于 1,2,3,...,n 和 2,3,..., ...
- 正方形分成16份,将1到16填入其中。让行和列都是从大到小。问一共有多少种方法?...
看了到面试题: 将正方形分成16份,将1到16填入其中.让行和列都是从大到小.问一共有多少种方法? 此题 解法有: 1. 穷举,基本不用考虑 复杂度O(16!). 2. 枚举+剪枝 .代码如下:得到答 ...
- 从19本书中选取五本,并且要求这五本互相不相邻,一共有多少种方法?
题目: 从19本书中选取五本,并且要求这五本互相不相邻,一共有多少种方法? 解决方案一:挡板问题--插空法 假设当前在书架上已经放好14本书,那么只需要再把剩下五本书插入这些空中即可. 14本书有15 ...
- 楼梯有n个台阶,一共有多少种上楼的方法?
楼梯有n个台阶,上楼可以一步上1阶,也可以一步上两阶.一共有多少种上楼的方法? 一.前言 看到这么个题目时,一脸懵逼,不知道说的啥意思,然后就多读了两边题目发现,如果有一阶楼梯,那你就一步就上去了,也 ...
- N级台阶(比如100级),每次可走1步,2步,3步,求总共有多少种走法?
算法题:N级台阶(比如100级),每次可走1步,2步,3步,求总共有多少种走法? 平常不怎么研究算法,直到一次面试后,面试官给我了一个算法题,因为平常没有去看过类似的东西,所以就做错了 根据上面的题目 ...
- 【八皇后】给定一个大小为 n 的正方形国际象棋棋盘,求有多少种方式可以放置 n 个皇后并使得她们互不攻击,即每一行、列、左斜、右斜最多只有一个皇后。
给定一个大小为 n 的正方形国际象棋棋盘,求有多少种方式可以放置 n 个皇后并使得她们互不攻击,即每一行.列.左斜.右斜最多只有一个皇后. 输入是一个整数 n,输出是一个整数 m,表示所有的棋盘表示方 ...
- java的list遍历_【java】list集合遍历的5种方式
平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...
最新文章
- quartz表达式在线生成器
- Linux常用服务安装部署
- python代码壁纸-Python爬取高清壁纸
- 浏览器和搜索引擎的区别
- SQLServer-sysobjects-type
- 关于a标签的href属性的注意事项
- 使用OmniDB数据库管理工具,管理Oracle/MariaDB/PostgreSQL等关系型数据库
- java5 ReadWriteLock用法--读写锁实现
- mozilla原代码编译
- 私服游戏怎么选择服务器性能和配置。
- Python:Django面试题
- vue中使用iconfont图标
- 【文献心得】关于内核在不同芯片平台移植的相关整理
- (Research)泛癌单细胞分析揭示肿瘤微环境中癌相关成纤维细胞的异质性和可塑性
- 关于围棋的基本功(转)
- DEVC++第五人格V2.0
- 幸运数的定义及其判断
- 《逆袭大学——传给IT学子的正能量》目录
- 有个问题,win10系统,网络诊断,将来会自动连接到jinling,什么意思?
- java轮播添加图片_给网站首页添加图片轮播的效果