智能地在水桶中存水 - 算法建议?

时间:2013-06-04 05:26:57

标签: algorithm

我在工作中遇到了这个问题。 我正在重新解决问题(从其原始背景),以便更容易理解。

你有几个水桶容量。 你有水壶,只能倒入某些水桶。罐子可以部分地倒空到多个“允许”桶中。

你必须弄清楚是否给出了水壶和水桶的配置,所有的水罐都可以转移到合法水桶而不会溢出。

示例:

说你有水桶A,B& C。 它们分别具有300,400和500个容量。

现在你有3个水壶J1,J2& J3。 他们有300,500和500分别为200单位水。

  1. J1可以清空到A& B
  2. J2可以清空到A,B& ç
  3. J3可以清空到C
  4. 请注意,此配置可以解决。 一种可能的解决方案配置可能如下所示:

    1. A - J1在这里完全清空 - 无法再填充这个桶
    2. B - J2在这里完全清空 - 无法再填充此桶
    3. C - 来自J2的100个单位和来自J3的200个单位使这个桶能够填充500 - (100 + 200)= 200个单位
    4. 解决此问题的最佳方法是什么?我怀疑这可能是一个已知的算法。一个小小的谷歌搜索让我无处可去。

      我现在的暂定解决方案是当我需要将水倒入特定的水桶时,在水桶之间移动水(回溯)。请注意,我还没有完全刷新它。

1 个答案:

答案 0 :(得分:4)

这可以视为max flow问题。

为每个水壶和每个水桶创建一个源节点,一个汇聚节点和节点,并从源到每个水壶添加一条边,其容量等于该水壶中的水量。在允许的水桶/水桶对之间添加具有无限容量的边缘,并将每个水桶的边缘添加到水槽节点,其容量等于水桶的容量。

现在找到最大流量。如果它等于水的总量,那么你有一个解决方案。