确定一美元金额的最佳硬币组合

时间:2010-10-08 23:34:32

标签: javascript math numbers pseudocode mathematical-optimization

我需要找到构成一定金额的最佳硬币组合。基本上,我想用最少量的硬币到达那里。

例如:

如果货币系统有硬币:{13,8,1},贪婪的解决方案会将24改为{13,8,1,1,1},但真正的最优解是{8,8 ,8}。

我希望用Javascript写这个,但伪代码很好,因为我相信这会有助于更多人。

2 个答案:

答案 0 :(得分:6)

一般来说,问题实际上是NP完全的(见Change-making problem)。但是,对于许多货币系统(包括{1,5,10,25}的美国系统),贪婪算法也恰好是最优的。

答案 1 :(得分:1)

这个问题尖叫动态编程

基本的伪代码应该是这样的:

  • C(n)是用于总计 n 的最小硬币数。
  • 在每个递归步骤中,找到下一个最大值硬币 c ,然后选择 C(n)
  • C(nc)+1 之间的最小值(使用所述硬币,更新使用的总硬币和剩余价值)和 C(n)(不是使用硬币) - 在两种情况下从下一次迭代的可用硬币列表中删除 c

请注意,此算法适用于您所指的一般情况。对于任何其他硬币系统,每个硬币是其后的硬币(世界上大多数硬币系统)的除数 - 贪婪的解决方案是最简单的,并且是最佳的。