硬币问题
问题描述
有1元,5元,10元,50元,100元,500元的硬币各c1,c5,c10,c50,c100,c500枚.
现在要用这些硬币来支付A元,最少需要多少枚硬币?
假定本题至少存在一种支付方案.
0≤ci≤10^9
0≤A≤10^9
输入:
第一行有六个数字,分别代表从小到大6种面值的硬币的个数
第二行为A,代表需支付的A元
样例:
输入
3 2 1 3 0 2
620
输出
6
思路分析
为了了尽量地减少硬币的数量,我们首先得尽可能多地使用500元硬币,剩余部分尽可能多地使用100元硬币,剩余部分尽可能多地使用50元硬币,剩余部分尽可能多地使用10元硬币,再剩余部分尽可能多地使用5元硬币,最后的部分使用1元硬币支付。
也就是优先使用大面值的硬币。使用贪心算法
代码实现
import java.util.Scanner;
import static java.lang.Math.min;
public class Coins {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
static int[] cnts = new int[6];
for (int i = 0; i < 6; i++) {
cnts[i] = sc.nextInt();
}
int A = sc.nextInt();
int res = f(A, 5);
System.out.println(res);
}
static int[] coins = {1, 5, 10, 50, 100, 500};
/**
* 尽量先用大面值,因为不用大面值,将使用更多的小面值硬币,一定得不到最优解
* @param A: 待支付金额
* @param cur:指针,由大到小,依次递减。为了指向当前最大面值
* @return
*/
static int f(int A, int cur) {
if (A <= 0) return 0;
if (cur == 0) return A;
int coinValue = coins[cur];
int x = A / coinValue;//金额有多少个coinValue
int cnt = cnts[cur];//当前面值的硬币有cnt个
int t = min(x, cnt);
return t + f(A - t * coinValue, cur - 1);//用t个当前面值,剩下的继续处理
}
}
运行结果
知识小结
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 6; i++) {
cnts[i] = sc.nextInt();
}
输入数字,用空格分隔开