这实际上看起来像是复式会计概念可以帮助的工作。
您的交易可以构造为簿记条目,因此:
Alice Bill Charles Balance
Alice -> Bill $10 10 10- 0 0
Bill -> Alice $1 9 9- 0 0
Bill -> Charles $5 9 4- 5- 0
Charles -> Alice $5 4 4- 0 0
你有它。在每笔交易中,您贷记一个分类帐并借记另一个分类帐,以便余额始终为零。最后,您只需计算出应用于每个帐户的最少交易数量,即可将其归零。
对于这个简单的案例,这是从比尔到爱丽丝的简单 4 美元转账。您需要做的是将至少一个帐户(但最好是两个)减少到零,以添加每笔交易。假设你有更复杂的:
Alice Bill Charles Balance
Alice -> Bill $10 10 10- 0 0
Bill -> Alice $1 9 9- 0 0
Bill -> Charles $5 9 4- 5- 0
Charles -> Alice $5 4 4- 0 0
Charles -> Bill $1 4 5- 1 0
那么所需的交易将是:
Bill -> Alice $4 0 1- 1 0
Bill -> Charles $1 0 0 0 0
不幸的是,在某些州,这种简单的贪婪策略并不能产生最佳解决方案(j_random_hacker
感谢指出这一点)。一个例子是:
Alan Bill Chas Doug Edie Fred Bal
Bill->Alan $5 5- 5 0 0 0 0 0
Bill->Chas $20 5- 25 20- 0 0 0 0
Doug->Edie $2 5- 25 20- 2 2- 0 0
Doug->Fred $1 5- 25 20- 3 2- 1- 0
显然,这可以在四步中逆转(因为到达那里只需要四步)但是,如果您不明智地选择了第一步(Edie->Bill $2)
,那么您将逃脱的最低限度是五步。
您可以使用以下规则解决此特定问题:
- (1)如果你能消灭两个平衡,那就去做吧。
- (2) 否则,如果您可以消灭一个平衡并设置自己在下一步消灭两个平衡,那就去做吧。
- (3) 否则,抹去任何一笔余额。
这将导致以下序列:
- (a) [1] 不适用,[2] 可以通过 实现
Alan->Bill $5
。
- (b) [1] 可以用 来完成
Chas->Bill $20
。
- (c) 和 (d),与 Doug、Edie 和 Fred 的推理类似,总共四步。
然而,这仅仅是因为可能性很小。随着人数的增加和群体的相互关系变得更加复杂,您很可能需要进行详尽的搜索才能找到所需的最少移动次数(基本上是上面的规则 1、2 和 3,但经过扩展以处理更多深度) .
我认为这是在所有情况下为您提供最少数量的交易所需要的。但是,最好的答案可能并不需要(最好,在这种情况下,意味着最大的“每块钱”)。可能即使是基本的 1/2/3 规则集也会为您的目的提供足够好的答案。