Python 优化账户间转账金额的策略,以最大限度地减少总转账金额?;

Python 优化账户间转账金额的策略,以最大限度地减少总转账金额?;,python,algorithm,Python,Algorithm,以下是原始记录: 出来 在里面 数量 A. B 10 B C 6. C A. 7. 从我先前的评论中得到了充实的答案: 我们可以计算每个账户的净损益。请注意,这是计算最佳最终结果所需的唯一信息:只要每个人在一天结束时都有正确的净收益和净损失,你就会达到你想要的结果 然后,我们可以将这个问题表述为二部图上的流问题。如果存在n净正账户和m净负账户,我们可以用m源和n汇创建一个完整的二分流量图,每个流量等于其所需的净流量,然后问一个问题:为了达到最大流量,必须流过的最小边数是多少 这似乎就是我们要问的

以下是原始记录:

出来 在里面 数量 A. B 10 B C 6. C A. 7.
从我先前的评论中得到了充实的答案:

我们可以计算每个账户的净损益。请注意,这是计算最佳最终结果所需的唯一信息:只要每个人在一天结束时都有正确的净收益和净损失,你就会达到你想要的结果

然后,我们可以将这个问题表述为二部图上的流问题。如果存在
n
净正账户和
m
净负账户,我们可以用
m
源和
n
汇创建一个完整的二分流量图,每个流量等于其所需的净流量,然后问一个问题:为了达到最大流量,必须流过的最小边数是多少

这似乎就是我们要问的问题,而答案似乎是这个问题是“NP难”,这大致意味着你不可能比暴力做得更好

如果你处理的数字非常小,你也可以寻找一个伪多项式时间(这意味着它在数量大小方面是有效的(在你的例子中,数量是6,7,1),而不仅仅是问题的大小(在你的例子中,问题的大小是3个帐户))算法类似于背包算法

贪心的 您发布的评论显示。贪婪算法失败,例如,如果值为

1   5 
5   5
5   5
5   5
5   5
5   100
99
最佳情况下,每个源帐户只需要1个事务。但是,贪婪算法将为每个源帐户生成大约2个事务。一般来说,贪婪算法产生的事务数大约是最优算法的两倍


但在最坏的情况下,它会产生类似于
n
的事务,其中
n
是帐户总数。(证明:在表示最终事务的图中,您永远不会有一个循环,因此最大边数必须是
n-1
)这与根本不进行优化(可能有
O(n^2)
事务)相比仍然是一个很大的改进。

您能更详细地描述一下您想要做什么吗?我不明白你的目标是什么,你想优化什么。@kostis1101嗨,我刚刚编辑了我的问题。只是尽量减少交易步骤和总金额。我希望我说的很清楚。你能和我们分享一下你当前的代码是什么样子的,以及你到目前为止尝试了什么吗?计算每个帐户的净损益。请注意,这是您需要的唯一信息。只要每个人在一天结束时都有正确的净损益,你就会快乐。所以,你们应该能够产生一个贪婪的算法,将净负账户的钱输出到净正账户。这个问题可能不允许一个简单的贪婪算法?