我正试图解决经典的动态编程硬币变化问题。这是一个家庭作业问题,我不是在寻找完整的解决方案,只是为了指出我做错了什么。
输入:
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个硬币)。
任何指针都将受到赞赏。
答案 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