我在工作中遇到了这个问题。
我正在重新定义这个问题(从它原来的上下文)以便更容易理解。
你有几个水桶能装水。
你的水壶只能倒进特定的桶里。罐子可以部分倒进多个“允许”的桶中。
你必须弄清楚,如果有水壶和水桶的配置,所有的水壶水都可以转移到合法的水桶,而不会溢出。
例子:
假设你有A桶,B桶和C桶。
它们的容量分别为300、400和500台。
现在你有3个罐子j1,j2和j3。
它们分别有300、500和200单位的水。
j1可以倒进A&B
j2可以倒进a、b和c
J3可以清空成C
注意,这个配置是可以解决的。
一种可能的解决方案配置可能如下所示:
A-J在这里完全空了-不能再装满这个桶了
B-J2在这里完全清空-不能再装满这个桶了
从j2到j3的c-100单位和200单位,使这个桶能够装满500-(100+200)=200单位以上
解决这个问题的最好方法是什么?我怀疑这可能是一个已知的算法一个小小的谷歌搜索让我一无所获。
我现在的暂定解决方案是,当我需要将水倒入特定的桶中时,在桶之间移动水(回溯)。注意,我还没有完全冲掉它。

最佳答案

这可以看作是一个max flow问题。
为每个水壶和每个水桶创建一个源节点、一个汇节点和多个节点,并向每个水壶添加一个源边,容量等于水壶中的水量。在允许的jug/bucket对之间添加容量无限的边,并将每个bucket的边添加到容量等于bucket容量的sink节点。
现在找到最大流量。如果它等于水的总量,那么你有一个解决方案。

10-07 23:28