刚刚在看贪心算法的时候看到一个钱币找零的问题,突发奇想来自己写一个找零的算法。不多说,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);
}
}
测试结果如下:
该算法的思想是,每一步尽可能用面值大的纸币,面值大的纸币数量为零时,使用下一级的面值。其中使用了递归方法,有兴趣的同学可以将算法再优化一下。:)