找零算法

    刚刚在看贪心算法的时候看到一个钱币找零的问题,突发奇想来自己写一个找零的算法。不多说,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);
	}

}

测试结果如下:


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

猜你喜欢

转载自blog.csdn.net/DWL0208/article/details/77923997