题目
贪心算法~硬币问题
有1元,5元,10元,50元,100元,500元的硬币各{C_1, C_5, C_10, C_50, C_100, C_500} 枚。现在要用这些硬币来支付A元,最少需要多少硬币?假设一定会存在一种支付方案。
限制条件:0 <= C_1, C_5, C_10, C_50, C_100, C_500 <=10的9次方
0 <= A <= 10的9次方
输入样例:
C_1 = 3
C_5 = 2
C_10 = 1
C_50 = 3
C_100 = 0
C_500 = 2
A = 620
输出样例:
6(500元硬币1枚, 50元硬币2枚,10元硬币1枚,5元硬币2枚, 合计6枚)
有以下一种解决方案:
1.首先尽可能多的使用500元硬币;
2.剩余部分尽可能多的使用100元硬币;
3.剩余部分尽可能多的使用50元硬币;
4.剩余部分尽可能多的使用10元硬币;
5..剩余部分尽可能多的使用5元硬币;
6.最后剩余的部分使用1元支付。
java算法
import java.util.Scanner;
/**
* @author yangshuai
* @version 创建时间:2015-10-20 下午6:15:16
* 类说明 :硬币问题-贪心算法
*/
public class CoinAlgorithm {
// 数据面额
private static final int V[] = new int[]{1, 5, 10, 50, 100, 500};
// 硬币个数
private static int C[] = new int[6];
// 要组成的总金额
private static int A;
// 总的使用金币数
private static int count;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("欢迎来到硬币算法, 有如下几个面值硬币 1元, 5元, 10元, 50元, 100元, 500元");
System.out.println("请输入各个硬币拥有的枚数:");
for (int i = 0; i < 6; i++) {
C[i] = scanner.nextInt();
}
System.out.println("请输入 要组成的总金额");
A = scanner.nextInt();
System.out.println("开始计算:" + System.currentTimeMillis());
solve();
System.out.println("完成计算:" + System.currentTimeMillis());
System.out.println(count + " (" +
"1元硬币 "+C[0]+" 枚, " +
"5元硬币 "+C[1]+" 枚, " +
"10元硬币 "+C[2]+" 枚, " +
"50元硬币 "+C[3]+" 枚, " +
"100元硬币 "+C[4]+" 枚, " +
"500元硬币 "+C[5]+" 枚)");
}
public static void solve(){
for (int i = 5; i >= 0; i--) {
int t = Math.min(A / V[i], C[i]); // 获取使用V[i]的金币个数
A -= t * V[i]; // 减去使用 t 个 V[i] 的金额, 得到剩余的钱
count += t; // 存储使用的金币数
C[i] = t; // C[i] 存储该面值的 使用金币数
}
}
}