JavaScript - 这种硬币更改算法有什么问题

时间:2016-03-08 07:09:34

标签: javascript algorithm loops greedy coin-change

我试图使用贪心算法计算达到JavaScript金额所需的最小硬币数量

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

我决定制作一个可以解决这个问题的功能,但它不起作用

[2,1,1,0,2]

calculateChange函数接受两个参数,一个硬币值数组和金额。

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

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

接下来,我想到了一个检查是否已达到金额的条件

如果它还没有,我将启动一个迭代所有硬币值的for循环。对于贪婪算法,随着指数增加,硬币值减小。这是使用尽可能少的硬币

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

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

我期待的输出是这个

<html> 
<head> 
<script src="jquery.js"></script> 
<script> 
$(function(){
  $("#includedContent").load("button.html"); 
});
</script> 
</head> 

<body> 
 <div id="includedContent"></div>
</body> 
</html>

这意味着2 50s,1 quarter,1 dime和2 pennies

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

我能说的唯一解释是我错误地使用了循环。即使经过考试我也看不到它

我在这里缺少什么。非常感谢见解

2 个答案:

答案 0 :(得分:3)

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

while (sum < total)

会永远运行,因为total会增加,但永远不会减少。您可能希望更新sum而不是total。我猜你已经混淆了sum的语义(显然是所选硬币已经覆盖的值)和total的语义,这是函数的参数。

答案 1 :(得分:1)

您不需要嵌套循环。相反,您可以通过划分然后使用Math.floor()在每个步骤中执行整数除法。这将为您提供当前面额所需的硬币数量,然后您可以根据该数量减少剩余总数。

此外,第一个尝试将零置于dispatched数组中的循环对于数组索引具有错误的变量。

所以你可以尝试这样的事情:

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 ]