Min-Coin更换 - 有限套装的最佳解决方案

时间:2012-03-11 18:38:58

标签: coin-change

前段时间我正在阅读关于硬币更换问题的文章,我想将其用于假想的自动机器。

然而,自动机器只能有限地使用硬币,最好返回所需的最少数量的硬币,以限制提供每枚硬币的小型电机的需要。

这里不能使用贪婪算法我们想要最好的解决方案,也为机器工作需要知道每种类型的硬币和需要多少硬币。另一个事实是,有时机器没有足够的硬币来进行所需的更改,并且应该在检测到它时点亮一个小LED。

这与我在stackoverflow中看到的问题不同,有些人使用丑陋的贪婪方法而其他人没有考虑真实条件,硬币数量有限。这更适用于现实世界问题。

如果我错了,我会删除这个问题,只是希望有一些良好,稳定和明确的指示,可以在未来几年用于实际问题。

这是我的第一个问题,希望将来可以帮助某人。

1 个答案:

答案 0 :(得分:0)

我不知道有关ATM电机的限制,所以我只能看到一个问题 - 没有足够的硬币达到预期价值。

    protected void CalculateCoins(int sum)
    {
        int remainder = sum;
        int required = 0;

        // Array of coins should be sorted by value of coins
        CoinQnt[] normalizedCoins = new CoinQnt[]
        {
            new CoinQnt { Value = 50, Qnt = 1 }
            , new CoinQnt { Value = 20, Qnt = 100 }
            , new CoinQnt { Value = 10, Qnt = 100 }
            , new CoinQnt { Value = 5, Qnt = 100 }
            , new CoinQnt { Value = 2, Qnt = 100 }
            , new CoinQnt { Value = 1, Qnt = 100 }
        };

        Debug("Splitting {0}", sum);
        // Loop through available coins
        foreach( CoinQnt c in normalizedCoins )
        {
            if( remainder >= c.Value )
            {
                // Determine how many coins we need and how many are left
                required = Math.Min(remainder / c.Value, c.Qnt);
                Debug("Using {0} qnt of {1}", required, c.Value);
                remainder -= required * c.Value;
            }
        }
    }