以最低成本合并n个硬币以创建一个单一硬币

时间:2014-07-01 17:51:56

标签: algorithm

来自http://www.geeksforgeeks.org/amazon-interview-set-89/

  

我们有n个金币。我们需要合并所有n个硬币来创造   一枚硬币,我们可以同时合并两枚硬币。合并的成本   两个硬币等于那些硬币的价值。我们如何确保这一点   合并n个硬币的成本最低。

Ex: 5 ,8 , 4, 3, 9, 6
We will merge 3 and 4, cost=7 {Remaining coins: 5,8,9, 6,7}
Then we merge 5 and 6, cost=11 { Remaining coins: 11,8,9,7}
Then we merge 7 and 8, cost=15 { Remaining coins: 11,15,9}
Then we merge 9 and 11, cost=20 { Remaining coins: 20,15}
Then we merge 20 and 15, cost=35 { Remaining coins: 35}
Total cost: 7+11+15+20+35 = 88
     

如果我们将硬币阵列{5,8,4,3,9,6}合并在一起   时尚:

Merging 5 and 8, cost=13 {Remaining coins: 13, 4, 3, 9, 6}
Merging 13 and 4, cost=17 {Remaining coins: 17, 3, 9, 6}
Merging 17 and 3, cost=20 {Remaining coins: 20, 9, 6}
Merging 20 and 9, cost=29 {Remaining coins: 29, 6}
Merging 29 and 6, cost=35 {Remaining coins: 35}
Total cost: 114
     

我们可以看到第一种情况下成本较低。如何获得   合并所有n个硬币的最低成本??

     

这只是一个例子,硬币的数量可以是10 ^ 9

的范围

2 个答案:

答案 0 :(得分:8)

我没有多少考虑过这个问题,但是从我的头脑中看,贪婪的方法很可能会起作用:对硬币进行排序并始终先合并最小的硬币。这背后的直觉是你想要"合并"尽可能不经常使用最贵的硬币。

如果你有一枚硬币,你就完成了。如果你有两个硬币,你只有一个选择。考虑具有三个硬币的情况:A< B< C.我们可以通过三种方式合并这些:

A + B, (A + B) + C => 2A + 2B + C
A + C, (A + C) + B => 2A + 2C + B
B + C, (B + C) + A => 2B + 2C + A

我们看到第一个合并最小硬币的选项是最好的。请参阅Bill的答案,了解有关一直采取证据的宝贵见解 - 我提供的评论复制在此处:

你可以想到硬币'值是霍夫曼编码中使用的令牌频率。对于非常频繁的令牌,您需要一个简短的代码路径。我想比尔指出"合并"可以被认为是一种向霍夫曼树移动的方式:硬币合并的次数是它与根的距离。因此,霍夫曼算法的正确性证明应该适用于我描述的(也)贪婪算法,它基本上是霍夫曼,但不适用于编码。

答案 1 :(得分:1)

C_s成为合并S = [s_1, s_2, ..., s_n]的最佳成本。

然后,如果P和Q仅在一个元素(即p_i = q_i,除了恰好一个i)之外,在索引j和p_j < q_j处不同。然后我们有C_P <= C_Q

基本上,P和Q仅在单个硬币上有所不同,P具有较小的硬币。然后P的最佳合并将比Q的最佳合并具有更低的成本。

这证明@ Patrick87的贪婪算法是正确的。

顺便说一句,这基本上是一个一元的霍夫曼编码!