找零算法

来源:互联网 发布:生产线设计软件 编辑:程序博客网 时间:2024/06/05 08:20

    刚刚在看贪心算法的时候看到一个钱币找零的问题,突发奇想来自己写一个找零的算法。不多说,Show you the code。

import java.util.ArrayList;import java.util.HashMap;import java.util.List;public class money {int[] monlist = {1,2,5,10,20,50,100};//人命币的面值int[] count = {0,2,4,4,0,2,1};//各面值对应的张数HashMap<Integer, Integer> kv;List<Integer> back = new ArrayList<>();public money(){kv = new HashMap<>();for(int i =0;i<7;i++)//将面值,张数存放到map中kv.put(monlist[i], count[i]);}/** * 面值减一 * @param key */public void remove(int key){kv.put(key,  kv.get(key)-1);}/** * 找零函数 * @param mon * @return */public List<Integer> checkMoney(int mon){if(mon>0){boolean flag = true;//用于判断是否缺少零钱for(int i= 6;i>=0;i--){if(mon>=monlist[i]&&kv.get(monlist[i])>0){back.add(monlist[i]);remove(monlist[i]);checkMoney(mon=mon-monlist[i]);//此处递归flag = false;break;}}if(mon>0&&flag)System.out.println("零钱不够,还差"+mon+"元。");;}return back;}public static void main(String[] args) {//测试money my = new money();List<Integer> ls = my.checkMoney(98);//输出找零的面值ls.forEach(System.out::println);}}


测试结果如下:


该算法的思想是,每一步尽可能用面值大的纸币,面值大的纸币数量为零时,使用下一级的面值。其中使用了递归方法,有兴趣的同学可以将算法再优化一下。:)