硬币变化扭曲

时间:2012-07-03 21:51:36

标签: algorithm dynamic-programming

我正试图解决经典的动态编程硬币变化问题。这是一个家庭作业问题,我不是在寻找完整的解决方案,只是为了指出我做错了什么。

输入:

  • 金额x我们想以硬币支付某些价值。
  • 设置d代表可用的面额硬币数量(1c,5c,10c,25c,100c,200c)

输出:

  • 需要交换手续付款的最小硬币数量。

假设:

  • 收银机运营商拥有无限量的硬币供应,并知道如何进行最佳更改。

到目前为止我尝试做的事情:

我正在尝试构建一个数组C,这样每个元素C [i]都是/最小/用于交换金额i的硬币数量。

C [0] = 0

对于C [i],我通过将所有C [i-di]加1的最小值计算得出所有可用的硬币面额。然后我从可用的硬币中取出我挑选的硬币。

这种方法似乎适用于简单的情况,但是当我拥有时,例如:

99 99 0 0 0 1 0

我的方法失败了,因为它以1美元的价格“便宜”,这将产生2个硬币的交换,而不是支付精确的99美分(交换99个硬币)。

任何指针都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

似乎问题是当你达到你想要的价值时你会停下来。如果你继续前进,找出最大数量的硬币使值大于x,那么加上寄存器操作员进行适当更改的最小硬币数量,并从这个更大的列表中取最小值,你应该能够回答这个问题。

编辑: 如果使用两个数组,可以稍微简化一下,一个用于可以生成的值,另一个用于寄存器可以生成的值。然后你可以用某种方式比较这些来得到答案。

答案 1 :(得分:0)

要点: 你可以重复硬币。

解决方案: 构建一个数组,其中ARR [i] =最小硬币数,以产生值i。

一些伪代码:

ARR[MAX] = {MAXIMUM VALUE} // set all elements in the array to have some big value
ARR[0] = 0

for C in coins
 for i = 0; i <= needed_value; ++i
   if i+C <= needed_value && ARR[i+C] > ARR[i]+1
     ARR[i+C] = ARR[i]+1

Example:
coins = {1, 3}
needed_value = 8
ARR[] = 0 INF INF INF INF INF INF INF INF
after using the coin with value 3, we will have
ARR[] = 0 INF INF 1 INF INF 2 INF INF
after using the coin with value 1, we will have
ARR[] = 0 1 2 1 2 3 2 3 4
=> we need 4 coins to make the sum