假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?
用贪心算法的思想,很显然,每一步尽可能用面值大的纸币即可。在日常生活中我们自然而然也是这么做的。
在程序中已经事先将Value按照从小到大的顺序排好。
具体实现代码如下 所示:
/**
*@Title: LightMoney.java
*@Package greedyalgorithm
*@Description: TODO
*@author peidong
*@date 2017-5-16 上午9:13:12
*@version V1.0
*/
packagegreedyalgorithm;
/**
* @ClassName: LightMoney
* @Description: 钱币找零问题
* @date 2017-5-16 上午9:13:12
*
*/
publicclass LightMoney {
public static int N = 7;
public static int num = 0;
public static int[] count = {3, 0, 2, 1,0, 3, 5};
public static int[] value = {1, 2, 5, 10,20, 50, 100};
public static int moneyNum(int money){
//从大到小计算
for(int i = N-1; i >= 0; i--){
int temp =min(money/value[i], count[i]);
money = money -temp*value[i];
num+= temp;
}
if(money > 0)
num = -1;
return num;
}
/**
* @Title: min
* @Description: TODO
* @param i
* @param j
* @return
* @return int
* @throws
*/
private static int min(int i, int j) {
// TODO Auto-generated method stub
if(i <= j)
return i;
else
return j;
}
/**
*@Title: main
*@Description:测试用例
*@param args
*@return void
*@throws
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int money = 254;
int res = moneyNum(money);
if(res == -1)
System.out.println("No");
else
System.out.println(res);
}
}