硬币收藏家的问题

use*_*711 3 algorithm

我无法理解包合并算法。谁能一步一步解释包合并算法?我们如何打包以及如何合并?有没有其他最佳算法可以解决硬币收集器的问题?

mwf*_*ley 5

这是一个无代码的答案:我将尝试使用一些示例情况来解释该方法,并希望在我概括它时可以从它们中直观地看出。对不起,它很长,但如果你有条不紊地阅读它,它应该是有意义的。

假设一个硬币收藏家有两套硬币:一套美元硬币和一套半美元硬币。但是,硬币收藏家根据铸造日期对每枚硬币进行不同的估价。有些非常罕见,因此更有价值。

现在的情况是:他除了值钱的硬币外没有普通的钱,他需要用这些钱去商店买东西,柜台的店员只会按标准价值拿走。但是,当他珍视自己的收藏时,他想使用价值最低的一组硬币来付款。

假设他有 7 美元硬币和 5 个半美元硬币,他想买价值 4 美元的东西。一个简单的解决方案是只拿他的美元硬币并按价值排列它们,选择最不值钱的 4 个,然后交出它们,将剩下的 3 美元硬币放入口袋,这是最有价值的。

但后来他意识到,如果他把两块半美元“打包”在一起,他可以把这个包裹当作一个新的一美元大小的硬币。对于柜台的职员来说,它值一美元,但对于收藏家来说,它的价值是他使用的两个半美元的总价值。

更好的策略是查看他的半美元,取最便宜的两个,将它们打包成一个新的美元“硬币”,然后将其添加(“合并”)到他的一组美元中。所以现在他有 8 (7+1) 个美元大小的硬币/包裹和 3 (5-2) 个半美元。

这一步可以再重复一次,现在他有 9 个美元大小的硬币/包裹,还有 1 个不能与其他任何东西一起打包的剩余半美元。由于这是他最有价值的半美元,他意识到他不应该使用它并再次将其收入囊中,从而有效地解决了问题。

现在他只有一套 9 美元大小的硬币/包裹。他按价值对它们进行分类,选择价值最低的 4 个,然后将它们交给店员,将剩余的(最有价值的)硬币装进口袋。

稍微概括一下:想象一下他也有一些宿舍。在包装半美元硬币之前,他必须先将四分之一的硬币包装成半美元的包装(依次选择最便宜的一对,丢弃最有价值的剩余部分,如果有的话),然后将它们合并成半美元硬币的集合.

假设可能有较小的面额:1/8 美元、1/16 美元等。只要它们是两个的负幂,策略就可以概括:对最小面额的硬币进行排序,打包它们,将这些包裹合并到集合中下一个最小面额的,并继续直到您只有美元大小的硬币/包裹。

(还有一种情况值得考虑:如果要价不是整数美元,例如7 1/4美元。在这种情况下,在包装四分之一大小的硬币/包裹之前,您首先选择最便宜的,然后将其交给并从要价中减去它,然后将剩余的打包。这也可以概括为:每当价格需要特定面额时(即它是该面额的奇数倍);而包装该面额时,您首先删除最便宜的面额,从价格中减去它。当您进入美元阶段时,价格将是整数美元。)