前段时间我正在阅读关于硬币更换问题的文章,我想将其用于假想的自动机器。
然而,自动机器只能有限地使用硬币,最好返回所需的最少数量的硬币,以限制提供每枚硬币的小型电机的需要。
这里不能使用贪婪算法我们想要最好的解决方案,也为机器工作需要知道每种类型的硬币和需要多少硬币。另一个事实是,有时机器没有足够的硬币来进行所需的更改,并且应该在检测到它时点亮一个小LED。
这与我在stackoverflow中看到的问题不同,有些人使用丑陋的贪婪方法而其他人没有考虑真实条件,硬币数量有限。这更适用于现实世界问题。
如果我错了,我会删除这个问题,只是希望有一些良好,稳定和明确的指示,可以在未来几年用于实际问题。
这是我的第一个问题,希望将来可以帮助某人。
答案 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;
}
}
}