【问题标题】:Algorithm for the least amount of change变化最少的算法
【发布时间】:2011-03-08 07:39:48
【问题描述】:

是的,我知道有与此类似的帖子,但是在浏览完所有帖子后,我仍然陷入困境,因为我对编程非常陌生,并且给出的答案都不足以针对我的问题提供帮助。


问题。 编写一个有效的 ACL(算法计算机语言)算法,给定一件物品的成本(小于或等于 1 美元),给出购买者想要的 50 美分、20 美分、10 美分、5 美分和 1 美分硬币的数量如果他们交出一美元,就会收到。您必须尽量减少找零中的硬币数量。


该问题与任何特定的编程语言无关,答案只能使用简单的ACL语言,如if、if-else、while循环,不能使用数组或其他高级命令。

这是我所在的地方:

在此处输入代码算法最小变化量

{
    int cost, fifty, twenty, ten, five, one;

    fifty = 0;
    twenty = 0;
    ten = 0;
    five = 0;
    one = 0;

    read (cost);
    if (cost <= 50)
    {
        fifty = 1;

代码完成,感谢您的帮助!如果您发现任何歧义或可以帮助我简化代码,请告诉我。


Algorithm how much change
{
    int cost, change, fifty, twenty, ten, five, one;

    fifty = 0;
    twenty = 0;
    ten = 0;
    five = 0;
    one = 0;

    read (cost);
    change = 100 - cost;

    if (change >= 50)
    {
        fifty = fifty + 1;
        change = change - 50;
    }
    while (change >= 20)
    {
        twenty = twenty + 1;
        change = change - 20;
    }
    while (change >= 10)
    {
        ten = ten + 1;
        change = change - 10;
    }
    while (change >= 5)
    {
        five = five + 1;
        change = change - 5;
    }
    while (change >= 1)
    {
        one = one + 1;
        change = change - 1;
    }

    print(one, five, ten, twenty, fifty);
}

【问题讨论】:

  • 20 美分?出于好奇,我们在这里使用什么货币?我不确定谁有 20 美分。或者这个值只是假设的? (或者是错字)
  • 很多货币都做afaik。大多数货币都以这些比例出现(1-2-5),你要么有 5-10-25-50-100-250-500 个硬币,要么有 1-2-5-10-20-50-100-200 个硬币.至少欧元有后一种配置。
  • @nzifnab:可能是欧元。
  • 我是澳大利亚人,我们有 5c 10c 20c 50c $1 和 2$ 硬币。感谢到目前为止的所有帖子,对不起,我是个菜鸟,我只决定在大学选修一门编程课程,所以我没有经历过如此抱歉的经历。
  • 除了美国以外,几乎所有人都有 20c 件。

标签: algorithm coin-change


【解决方案1】:

实际上,cost >= 50 只需要检查一次,但这更通用(对于超过 1 美元的情况)

while (cost >= 50)
{
fifty++;
cost -= 50;
}
while (cost >= 20)
{
twenty++;
cost -=20;
}
...

【讨论】:

  • 我更喜欢fifty = floor(cost/50)
  • 谢谢 MByD,不得不用谷歌搜索 ++ 和 -= 是什么:S 因为我们还没有学到这一点,只能在我们的答案中使用我们学到的东西。我在答案中发布了我完成的代码,如果您发现任何歧义,请告诉我,谢谢。
  • 其实我会推荐使用 Space_C0wb0y 建议的方法:fifty = cost / 50; cost = cost % 50; twenty = cost / 20; cost = cost % 20; 等,当 % 给出余数时。
  • 对于该语句的这一部分“五十 = 成本/50”,因为 50 是一个整数,这是否会成为一个问题,因为该语句的答案很可能是一个小数?
  • 在大多数语言中,除法 80 /50 将返回 1,您也可以使用 floor(cost/50) 作为 Space_C0wb0y 的建议。
【解决方案2】:

对于您的特定更改金额,我相信一个简单的贪婪幼稚的“选择最大的,直到我再也不能”的策略会奏效。

例如:

  1. 在 50 的数量大于零钱之前,我可以挑选多少个 50?跟踪 50 的数量,从总数中减去该数量
  2. 重复 20 次、10 次等。

但是,贪婪方法并不总是有效。对于“通用”解决方案,请参阅Coin Change - Algorithmist

【讨论】:

  • 你能解释一下你是如何断定这是NP完全的吗?
  • 哎呀,我想我一定累了(凌晨 1 点还不算晚,是吗?)因为我的意思是这是一个贪婪方法行得通的情况。更改了帖子以反映这一点。
  • 根据Wolfram,这个问题只被证明是NP-Hard,不完整。
  • @Space_C0wb0y NP-Hard 问题是找到无法用给定硬币面额表示的最大数字,如果包含1,则永远不会发生这种情况。也就是说,我还没有看到任何证据表明贪婪对任何教派都是最优的。
【解决方案3】:

因为这听起来像是作业,所以我不会马上给出答案,而是给你一个正确方向的提示。

假设你是你程序中的某个点。您还有一定的金额可以退还,比如说 80 美分。您将如何获得一枚您肯定必须归还的硬币?

【讨论】:

    【解决方案4】:

    提示:从最大的硬币开始,找出可以使用的最大硬币数,然后转到第二大的硬币并重复。看起来他们用 20 个硬币而不是 25 个 lol 让你更轻松。

    【讨论】:

      【解决方案5】:

      more detailed:
      

      and even a brute force algorithm which is O(d M^d)
      


      This is fromMax Alekseyev, University of South Carolina cse

      【讨论】:

      • 你从哪里得到这些?如果不是您自己制作的,请引用来源。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 2015-08-26
      • 2023-03-03
      • 1970-01-01
      • 2011-03-02
      • 2012-01-13
      • 1970-01-01
      相关资源
      最近更新 更多