【贪心策略】硬币问题

绝地灬酷狼 2022-04-02 04:18 379阅读 0赞

问题描述:

有vi=1元、5元、10元、50元、100元、500元的硬币c1、c2、c3、c4、c5枚。若用这些硬币来凑出A元,最少需要多少枚硬币?

贪心策略:

初始化numOfCoins=0,若A>0

每一次都优先挑金额最大的硬币 i

  1. 若该硬币金额大于A,则挑金额次之的硬币
  2. 若该硬币金额小于A & 该硬币的剩余数量 ci 不为0,则A=A-vinumOfCoins++

代码实现:

  1. // 贪心算法————硬币问题
  2. public class CoinsTest {
  3. public static void main(String[] args) {
  4. int[] v = {0, 1, 5, 10, 50, 100, 500}; // 硬币的金额
  5. int[] c = {0, 3, 2, 1, 3, 0, 2}; // 硬币的个数
  6. int A = 620; // 数额
  7. int numOfCoins = 0; // 记录总共需要的硬币个数
  8. int[] flag = new int[7]; // 记录对应的硬币被选择的次数
  9. for (int i=6; i>0; i--) {
  10. // A == 0
  11. if (A == 0) { // 代码出口
  12. break;
  13. }
  14. // A > 0
  15. while (c[i] > 0) {
  16. if (v[i] > A) {
  17. break;
  18. } else {
  19. A -= v[i];
  20. c[i]--;
  21. numOfCoins++;
  22. flag[i]++;
  23. }
  24. }
  25. }
  26. //打印方案选择的硬币个数
  27. System.out.println("要凑出A元,至少需要"+ numOfCoins +"枚硬币");
  28. //打印方案
  29. System.out.print("所选择的硬币为:");
  30. for (int i=6; i>0; i--) {
  31. while (flag[i] > 0) {
  32. System.out.print(v[i]+"\t");
  33. flag[i]--;
  34. }
  35. }
  36. }
  37. }

运行结果:

20181225122026987.png

发表评论

表情:
评论列表 (有 0 条评论,379人围观)

还没有评论,来说两句吧...

相关阅读

    相关 贪心-硬币分配

    硬币问题 问题描述: 有1元、5元、10元、50元、100元、500元的硬币各C1,C5,C10,C50,C100,C500枚。现在要用这些硬币来支付A元,最少需要多少

    相关 硬币问题

    / 给出k中面值的硬币,每种硬币的数量无限,再给一个总金额amount,问最少需要几枚硬币凑出这个金额,如果凑不出,返回-1 dp[i]定义:当目标金额为i时,至少