最近有人问我如何计算一群一起旅行并遇到一个有趣问题的人的欠款:鉴于您知道每个人的欠款额,合并人与人之间债务的一般算法是什么?这样只需要最少的付款次数?以此为例:
我们可以通过重新安排债务来免除Mike和John之间的付款,如下所示:
因为它很容易,所以我手动进行数学运算,但是那时我的程序员却想找出一种通用算法来为任意大的组运算。在我看来,这似乎是一种图形算法,因此我将其重新表示为图形:
仅弄清楚接收者和给予者是不够的。虽然我认为这种策略是正确的,但它也无法确保找到最低付款额的算法。
例如,
很明显,这可以用3次付款完成(A和C到D,B到E)。我想不出一个能满足所有问题集的高效算法。
更好的例子
如果我们采用让D付给F的贪婪方法,我们将得到次优解而不是最优解(A&D到E,B&C到F)。
这个问题与Bin Packing问题有很多相似之处,而Bin Packing问题已被证明是NP难的。唯一的区别是我们有多个大小不同的纸箱,而且条件是所有纸箱中的总空间等于所有物品的总大小。这使我相信该问题可能是NP难题,但加上更多的限制,有可能在多项式时间内解决。