我在尝试找出所需的最少数量的硬币以便分配正确的更改时遇到了一些问题。请参考以下来源:
int[] change_given = new int[coins.Length];
int coin;
for (int i = 0; i < coins.Length; i++)
{
coin = Math.Min(quantities[i], (int)(change / coins[i]));
change -= coin * coins[i];
change_given[i] = coin;
}
return change_given;
由于一些奇怪的原因,当尝试将当前更改值降至最后5美分时似乎存在问题。请参考下面的示例输出:
数量表示当前硬币可被变化整除的次数。 硬币值位于输出的最左侧。正如您所看到的最后0.05美分数量设置为0,并且不正确。考虑到当前更改值设置为0.05,此数量应设置为1。 coins [i]的数据类型为double,change也设置为double的类型。请告知这里的问题,以及可能的解决方法。
答案 0 :(得分:1)
这不是对OP问题的回答。我只是想我会尝试制作一个基于LINQ的功能解决方案,以找到与此问题所寻求的结果类似的变化。这是:
Func<int, IEnumerable<int>, IEnumerable<int>> getChange = null;
getChange = (a, cs) =>
cs.Any()
? (a >= cs.First()
? cs.Take(1).Concat(getChange(a - cs.First(), cs))
: getChange(a, cs.Skip(1)))
: Enumerable.Empty<int>();
现在我可以用它来查找更改:
var coins = new [] { 200, 100, 50, 20, 10, 5, };
var change = getChange(425, coins);
这给了我这个结果:
就像我说的那样,除了这消除了分裂的使用这一事实外,这并没有回答这个问题。我只是觉得我会发布它的“纯粹”喜悦。 (原谅双关语。)
评论中要求的F#实现:
let rec GetChange a cs =
match cs with
| [] -> []
| x::xs -> if a >= x
then x::(GetChange (a - x) cs)
else GetChange a xs
GetChange 425 [200; 100; 50; 20; 10; 5]