当前位置: 首页 > 知识库问答 >
问题:

JavaScript-这种硬币兑换算法有什么问题

任飞鸣
2023-03-14

我试图使用贪婪算法来计算在JavaScript中达到一定数量所需的最低硬币数量

返回结果将是一个数组,由每个级别的硬币数量组成

我决定做一个函数来解决这个问题,但它不起作用

window.addEventListener('load', function(e) {
  function calculateChange(coins, total) {
    var sum = 0;
    var dispatched = [];
    for (var i = 0; i < coins.length;i++) {
      dispatched[c] = 0;
    }

    while (sum < total) {
      for (var c = 0; c < coins.length; c++) {
        while (total - sum >= coins[c]) {
          total += coins[c];
          dispatched[c]++;
        }
      }
    }
    return dispatched;
  }

  alert(calculateChange([50,25,10,5,1],137));
}, false);

calculateChange函数包含两个参数:硬币值数组和金额。

第一步是初始化一个sum变量,该变量显示已调度的更改量。我还将创建一个数组变量,该变量将保存某个硬币的分配次数。

为此,我将迭代coins数组并将所有值设置为0。如果我不知道不同硬币价值的数量,这一点很重要

接下来,我考虑设置一个while条件,检查金额是否已达到

如果没有,我将启动一个for循环,迭代所有硬币值。对于贪婪算法,随着索引的增加,硬币的价值降低。这是使用尽可能少的硬币

为了防止跳下硬币层次结构,将有一个while循环嵌套在这个for循环中。这个while循环将检查最大的硬币是否仍然可以使用。

如果不是,循环条件满足,而循环将结束。for循环将通过递增索引来继续。我们将向下移动到下一个较低级别的硬币。过程会重复

我期望的结果是

[2,1,1,0,2]

这意味着2个50美分,1个25美分,1个10美分和2个便士

在这个函数中,它应该表示dispatched的值,即返回值。运行上述代码时,我没有得到返回值

我能得到的唯一解释是我用错了循环。即使经过检查我也看不出来

我错过了什么。见解受到极大赞赏

共有2个答案

满勇军
2023-03-14

您不需要嵌套循环。相反,您可以简单地在每一步进行整数除法,方法是除法,然后使用Math.floor()。这给了你当前面额所需的硬币数量,然后你可以在此基础上减少剩余的总数。

此外,第一个尝试在调度数组中放置零的循环为数组索引提供了错误的变量。

因此,您可以尝试以下方法:

function calculateChange( coins, total ) {
    var dispatched = [];
    for( var i = 0;  i < coins.length;  i++ ) {
        dispatched[i] = 0;
    }

    for( var c = 0;  total > 0;  c++ ) {
        dispatched[c] = Math.floor( total / coins[c] );
        total -= dispatched[c] * coins[c];
    }
    return dispatched;
}

console.log( calculateChange( [50,25,10,5,1], 137 ) );
// logs [ 2, 1, 1, 0, 2 ]
常献
2023-03-14

显然,变量sum初始化为0,并且从未更新,因此循环

while (sum < total)

将永远运行,因为总计增加,但从未减少。也许您想更新而不是总计。我猜你已经混淆了(显然是已经被选择的硬币覆盖的值)和总计的语义学,这是函数的参数。

 类似资料:
  • 这是hackerrank(https://www.hackerrank.com/challenges/coin-change)的硬币更换问题。它要求计算使用给定面值的硬币对N进行更改的方法总数。 例如,有四种方法可以使用面额为1、2和3的硬币兑换4。它们是-

  • 以人民币的硬币为例,假设硬币数量足够多。要求将一定数额的钱兑换成硬币。要求兑换硬币数量最少。 思路说明: 这是用贪婪算法的典型应用。在本例中用python来实现,主要思想是将货币金额除以某硬币单位,然后去整数,即为该硬币的个数;余数则做为向下循环计算的货币金额。 这个算法的问题在于,得出来的结果不一定是最有结果。比如,硬币单位是[1,4,6],如果将8兑换成硬币,按照硬币数量最少原则,应该兑换成为

  • 我在理解动态规划中的硬币兑换问题时遇到了一个小问题。简单地说,我必须用最少数量的硬币来兑换一笔钱。 我有n种面值为1=v1的硬币

  • 如果每枚硬币的数量是无限的,那么复杂性是O(n*m),其中是总变化,是硬币类型的数量。现在,当每种类型的硬币都受到限制时,我们必须考虑剩余的硬币。我设法使它与的复杂性使用另一个大小的,所以我可以跟踪每个类型的剩余硬币。有没有一种方法可以让复杂性变得更好?编辑:问题是计算进行精确给定更改所需的最少硬币数量以及我们使用每种硬币类型的次数

  • 我编写的代码使用动态规划解决了基本的硬币兑换问题,并给出了进行兑换所需的最小硬币数量。但是我想把每个硬币的数量存储在最小的数字里。 我试图做的是初始化数组,就像散列一样,只要找到,它就会增加的数量,即。但这并不是我想要的方式,因为它每次发现对应于时都会添加硬币。因此,在最终答案中,数字不是硬币的最终计数。 代码如下:

  • 我试图自己解决LeetCode问题322。硬币兑换: 您将获得一个整数数组,表示不同面额的硬币,以及一个整数金额,表示总金额。 返回您需要的最少数量的硬币,以弥补该金额。如果这些硬币的任何组合都无法弥补这一数额,则返回-1。 你可以假设每种硬币的数量是无限的。 我似乎有一个错误,无法找出它。 我用DFS解决,基本上是说当目标达到0时,只需将所有的聚集在一个数组中,并动态地保持尽可能短的结果。这是问