硬币收藏家的问题

时间:2011-04-25 19:44:38

标签: algorithm

我无法理解包合并算法。 任何人都可以一步一步解释包合并算法吗? 我们如何打包以及如何合并? 还有其他解决硬币收集器问题的最优算法吗?

3 个答案:

答案 0 :(得分:3)

这是一个无代码的答案:我将尝试使用一些示例情况来解释该方法,并希望它可以直接来自它们,因为我概括了它。对不起,它很长,但是如果你通过有条不紊的方式阅读它应该都有意义。

让我们说硬币收藏家有两套硬币:一套美元硬币和一套半美元硬币。然而,硬币收集器根据例如它的铸造日期来不同地对每个硬币进行评价。有些非常罕见,因此更有价值。

现在的情况是:除了他的宝贵硬币外,他没有普通的钱,他需要用它们在商店买东西,柜台的店员只会按照标准价格购买。但是,当他重视他的收藏品时,他想用他能用的最便宜的硬币来付款。

所以,假设他有7美元硬币和5美元半硬币,他想要买4美元的东西。一个简单的解决方案是拿出他的美元硬币并按价值排名,选择价值最低的4个,然后将它们交给他们,将剩余的3美元硬币收入囊中,这是最有价值的硬币。

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

一个更好的策略是看看他的半美元,拿最便宜的两个,将它们打包在一起作为一个新的美元“硬币”,并将其加入(“合并”)到他的一套美元中。 所以现在他有8(7 + 1)美元大小的硬币/包和3(5-2)半美元。

此步骤可以再次重复,现在他有9美元大小的硬币/包裹,还有1个剩余的半美元,不能用其他任何东西包装。由于这是他最有价值的半美元,他意识到他不应该再使用它并将其重新装袋,从而有效地将其从问题中解脱出来。

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

稍微概括一下:想象他也和他有一些差别。在包装半美元硬币之前,他必须首先将季度包装成半美元套餐(依次选择最便宜的套餐,丢弃最有价值的套餐,如果有的话),然后将它们合并到半美元硬币中。

假设可能会有较少的面额:1/8美元,1/16美元等等。只要它们是2的负权力,策略就可以概括:对最小面额的硬币进行排序,打包它们,合并包裹进入下一个最小面额的集合,并继续,直到你只有美元大小的硬币/包。

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

答案 1 :(得分:0)

它不适用于非常简短的解释;你读过Wikipedia page?

吗?

答案 2 :(得分:0)

我发现硬币类比无益。你可能也是。对我来说更直观的是考虑一组各种长度的杆,功率为2:1 / 4,1 / 2,1,2,4,8 .......每根杆的价格不同。你需要花费最少的钱在杆上并且跨越一段确切的距离X.

使用这些杆的任意组合,您只能/精确/跨越一个二元距离,即“在其分母中只有两个因子”,即在该点之后具有终止二进制表示。你不能跨越1/5或4 3/7,因为没有有限数量的杆完全匹配这样的距离,总会有一点遗留。

所以假设你已经覆盖了一个diadic X,你用什么棒?想想你距离X中使用的最小二进制分数。如果X是13 3/128那么那是1/128。这就是您需要的准确度。

一个。如果你的所有杆都大于1/128那么你就被塞满了。你的杆都没有足够精细到最后的1/128。运气不好。

湾如果1/128是你拥有的最小杆,你将不得不至少使用其中一根杆。没有选择去那个额外的小距离:你将使用一个。所以不妨现在买最便宜的1/128棒。然后你可以用其余的杆来解决剩余的略小的问题(13 1/64)。

℃。如果你的最小杆比1/128(比如1/512)更小,那么你可能会使用它们,但只能使用偶数杆。如果你使用一个奇数,你会留下一些微小的数量(这里是1/512)而且无论你用更大的棒做什么都无法摆脱那些额外的一点而且你被塞满了。所以你要么不使用它们,要么使用偶数。如果你最终使用两个,你最终将使用最便宜的两个。如果你最终使用四个,你最终将使用最便宜的四个,依此类推。

所以你会成对使用它们。如果你选择最便宜的两个 - 比如它们花费5p和7p - 那么如果你使用它们,那么你将有效地使用它们,好像它们是一个1/256件,花费12p。因此,将它们从1/512堆中取出,并将它们视为12p 1/256件以及所有其他1/256件。剩下的第三块1/512块是最昂贵的一块,没用,它不会因为上面的原因而被使用,它太精细了,会留下这么小的一部分。

现在我们已经完成了1/512堆,您现在可以考虑1/256桩,这是现在最小的,也许有一个合适的1/256(比如花费8p),还有我们的“包“两个1 / 512s(费用说12p)。然后,您可以使用上面的参数将它们打包成一对。它的成本为20便士,相当于1/128件。

你还没有承诺使用任何这些软件包,你只知道如果你这样做,你将使用整个软件包。而且你继续增加尺寸,每次都要减少问题,无论是通过减少包装的总件数,还是减少目标。

所以最终,你会达到你的目标,或证明你不能。

最重要的是要记住,当你构建一个包时,你不是,那时候,承诺使用它,你只是说/如果/你这样做,那么你将使用内部的棒作为一个单位。