小编典典

确定组中最低付款额的算法

algorithm

问题

最近有人问我如何计算一群一起旅行并遇到一个有趣问题的人的欠款:鉴于您知道每个人的欠款额,合并人与人之间债务的一般算法是什么?这样只需要最少的付款次数?以此为例:

  • 迈克欠约翰100
  • 约翰欠瑞秋200
  • 迈克欠瑞秋400

我们可以通过重新安排债务来免除Mike和John之间的付款,如下所示:

  • 迈克欠约翰0
  • 约翰欠瑞秋100
  • 迈克欠瑞秋500

因为它很容易,所以我手动进行数学运算,但是那时我的程序员却想找出一种通用算法来为任意大的组运算。在我看来,这似乎是一种图形算法,因此我将其重新表示为图形:

以图形形式查看

  • 顶点是组中的人
  • 边缘被定向并通过所欠的量加权。例如,从Mike到Rachel的重量为500的边缘意味着Mike欠Rachel 500。
  • 约束:每个节点的权重净和必须保持不变。
  • 目标是找到具有仍可满足约束的最小边数的图。

阅读 248

收藏
2020-07-28

共1个答案

小编典典

仅弄清楚接收者和给予者是不够的。虽然我认为这种策略是正确的,但它也无法确保找到最低付款额的算法。

例如,

  • 人欠25
  • 人欠50
  • 人欠75
  • 欠人D 100
  • 欠人50

很明显,这可以用3次付款完成(A和C到D,B到E)。我想不出一个能满足所有问题集的高效算法。

更好的例子

  • 人欠10
  • 人欠49
  • 人欠50
  • 人欠65
  • 欠人E 75
  • 欠F人99

如果我们采用让D付给F的贪婪方法,我们将得到次优解而不是最优解(A&D到E,B&C到F)。

这个问题与Bin
Packing
问题有很多相似之处,而Bin
Packing问题
已被证明是NP难的。唯一的区别是我们有多个大小不同的纸箱,而且条件是所有纸箱中的总空间等于所有物品的总大小。这使我相信该问题可能是NP难题,但加上更多的限制,有可能在多项式时间内解决。

2020-07-28