问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JAVA 递归找零钱

发布网友 发布时间:2022-05-07 04:03

我来回答

2个回答

热心网友 时间:2023-10-14 20:42

看了楼上的写法后,不甚满意,于是自己写了一种。
这个题目很有意思,相当有意思。
加上了比较详细的注释。
你试一试。
这种方法你能很明显的看出递归的特征。
可以随意传要找钱的总数,以及硬币面额可以增加或者减少。但是
硬币的面额要由小到大排列,就ok
注释加的有点多。。看起来有点累赘。不过能容易看。

package file;

import java.util.ArrayList;
import java.util.List;

/**
* 递归得到找钱方案个数
* 思路为:
* 定义待找钱币类型。默认从小到大排列。
* 传入参数后,先获得最大的硬币面值。通过整除,得到可以有几种找钱情况
* 递归调用找钱,因为排除了最大面额硬币后的可找硬币以余额都发生了变化。可以看作一次新的找钱
* 最终得到所有的找钱方案。封装到List中返回。
* @version TestRePay.java v. 1.0.0 2010-10-26
* @author Andy
*/
public class TestRePay {
public static void main(String[]args){
int i = 150;
int[] coinType = new int[]{1,5,10,25,50};
//调用递归方法
List<String> allResult = reCoins(coinType, i);
System.out.println("找钱方案的个数为:"+allResult.size());
for(int j = 1 ,k = allResult.size(); j<=k;j++ ){
System.out.println(" 第"+j+"种找钱方案为:"+allResult.get(j-1));
}
}
/**
* 通过递归,得到所有的方案数量
* author Andy
* date 2010-10-26 下午01:30:06
* @param coinType 可以找给客户的钱币的类型 为int数组
* @param totalMoney 待找钱的数量
* @return
*/
public static List<String> reCoins(int[]coinType , int totalMoney){
//获得最后一个,也就是默认为最大的一个钱币类型
int lastCoin = coinType[coinType.length-1];
//通过数组复制获得下一级调用时候的硬币类型
int[] newCoinType = new int[coinType.length-1];
System.arraycopy(coinType, 0, newCoinType, 0, newCoinType.length);
//获得针对当前硬币,也就是这个lastCoin 有几种找钱情况
int times = totalMoney/lastCoin;
List<String> resultList = new ArrayList<String>();
//如果当前硬币的面值大于余额。但是手中还有更小面值的硬币,则递归调用找钱。
if(times==0&&coinType.length!=0){
List<String> childList = reCoins(newCoinType, totalMoney);
resultList.addAll(childList);
//进行遍历,得到带找钱的值
}else{
//最小面值了,所以,直接返回值
if(coinType.length==1){
resultList.add(" 1分*"+totalMoney+"个 ");
}else{
//不是最小面值,所以,要遍历下
for(int i=1;i<=times;i++){
List<String> childList = null;
int remainder = totalMoney-lastCoin*i;//新余额
if(remainder != 0){
childList = reCoins(newCoinType, remainder);
for(String r:childList){
r = " "+lastCoin+"分*"+i+"个 " + r;
resultList.add(r);
}
}else{
resultList.add(" "+lastCoin+"分*"+i+"个 ");
}
}
}
}
return resultList;
}
}

加油,java的路 还有很长哦,呵呵

参考资料:手打

热心网友 时间:2023-10-14 20:42

一般都是找最少硬币数的方法,你这里要列出所有的可能,我理解没错吧?解法有很多,我只帮你写了一个,包括输出格式及测试。

import java.util.HashSet;
import java.util.Iterator;

public class MoneyChange {
private HashSet<int[]> allSolutions = new HashSet<int[]>();
private static int[] coins = {1,5,10,25,50};

// @param: amount, currSolution, MaxAvailableCoinIndex
public void computeSolutions(int total, int[] sol, int maxCoin){
if(total < coins[maxCoin])return;
//System.out.println(total+" "+maxCoin);
total -= coins[maxCoin];
sol[maxCoin]++;
if(total == 0){
// System.out.println("++"+allSolutions.size());
allSolutions.add(sol);
}else{
while(maxCoin>=0){
if(total>=coins[maxCoin])
computeSolutions(total, sol.clone(), maxCoin);
maxCoin--;
}
}
}

public void computeSolutions(int total){
if(total == 0)
return;
computeSolutions(total, new int[5], 4);
computeSolutions(total, new int[5], 3);
computeSolutions(total, new int[5], 2);
computeSolutions(total, new int[5], 1);
computeSolutions(total, new int[5], 0);
}

public void showSolutions(){
System.out.println("一共有:"+allSolutions.size()+"种方法");
Iterator it = allSolutions.iterator();
while(it.hasNext()){
int[] a = (int[]) it.next();
//for(int i:a){}
System.out.println("1分:"+a[0]+" "+"5分:"+a[1]+" "+"10分:"+a[2]+" "+"25分:"+a[3]+" "+"50分:"+a[4]);

}
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MoneyChange mc = new MoneyChange();
mc.computeSolutions(53);
mc.showSolutions();
}

}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
防静电手腕带简介 QQ管家的金币换礼品是骗人的吧,让输入验证码的时候礼品已经没了._百 ... 安全金币换礼包是真的嘛 电脑管家礼包是骗局? 管家里面用金币兑换实物,为什么我每次兑换都提示已兑换 电脑管家金币兑换礼包是正的吗? 中译英: 这件衬衫和你的裤子很配 我母亲今年79岁,九月份身体不适,B超和肝功检查,结果怀疑是有东西占位... 半永久眉毛二次补色后需要买修复剂吗 左边一个革,右边一个斥去掉点是什么字 c++编程Coin Changing 期货交易中个人持有的空单和多单能相互平仓吗?非常感谢啊! 参考文件Coin.java ,写一程序查找在100次掷硬币过程中连续heads面朝上的次数。 shiny词性,shining的词性,以及两者的区别 Java - 6个硬币的移动问题 C++编程题目 定义一个类coin 模拟翻硬币游戏 C++代码修正 交通银行协商还款要征信报告吗? 交通银行信用卡逾期5000,半年了,协商还款不行, 上门,立案!转第三方催收公司,暴力催收,真的吗 交通信用卡逾期一年多,打电话给客服,客服说有专门的人来协商,自称律师事务所的人来协商可信吗? 求推荐3000以内的编曲键盘(midi键盘),性价比高点的,最好说出特点,好在什么地方。 编曲键盘为什么那么贵?比电子琴高级在哪? 什么是编曲键盘? 战地之王狙击手SV98切枪技巧及狙击技巧(说得好的有加分) 编曲键盘pa600与psr670的艰难选择,求助 雅马哈最新顶级编曲键盘 是哪一款。 手机上支持上有音乐播放,收音机,视频播放,有啥区别 收音机能看视频的那种要什么格式的 能在视频收音机和电视上播放的视频是哪种格式的? 视频收音机能不能看电台广播 一个Java程序,提示找不到符号,怎么错了??? 军港之夜 简谱 军港之夜歌谱试唱 求《军港之夜》F调歌谱,简谱也行,谱例304 80年代凭借《军港之夜》红遍天下的苏小明,为啥后来突然不火了? 急急急:求军港之夜原版伴奏 苏小明版 4分多长的 带独白的那种 求军港之夜 苏小明伴奏 要有 演出急求苏小明《军港之夜》降B葫芦丝伴奏,4分多长带独白的伴奏,请发邮箱ilovelittle_2006@163.com 如何快速增加自己的记忆力? 怎样快速提高记忆力 记忆力提升的方法? 怎么提高快速记忆力 怎样才能让记忆力变强的方法? 怎么才能快速提高记忆力? 给个Q版的月亮头像 瓦一个平方多少块瓦 求可爱的月亮Q版图?急! 征求胖子吃月饼的Q版图,画画好的进来 很喜欢月亮的人,最好的礼物是什么? 这是谁,哪个卡通人物 屋面盖小青瓦,瓦宽170长140,二分之一搭,一平方需要多少瓦? 一平方米需要多少瓦节能灯