壶的算法?

时间:2014-03-12 18:10:56

标签: algorithm language-agnostic

我正在尝试提出一种适用于以下情况的算法:

  1. 无限的水壶清单
  2. 每个水壶都有最大容量。
  3. 目标是有一定数量(x)是其中一个水壶。
  4. 以下是一个例子:

    Jug 1 = 10 capacity
    Jug 2 = 4 Capacity
    Jug 3 = 2 capacity
    

    目标是在任何一个水壶中都有8个

    我需要确定它是否可能,如果是的话,我需要提供我使用的移动序列。请记住,我有一个无限制的水壶,“目标”由用户决定。

1 个答案:

答案 0 :(得分:1)

可能会有更高效的东西,但我会选择某种breadth-first search (BFS)

开始时所有的水壶都是空的。

在每一步,尝试填满每个(非完整的)水壶,并尝试将其中一个非空水壶中的所有水转移到另一个水壶(直到那个水壶已满或者我们已经离开水) - 这些动作中的每一个都可以被认为是当前状态(或节点)与另一个状态(或节点)之间的边缘 - 如果您熟悉BFS,这应该是有意义的。

继续,直到我们在其中一个水壶中获得目标数量。

示例:

我们的水壶尺寸为10,4和2,所需的数量为8。

所以我们从一个元素的队列开始(就像典型的BFS一样),所有的水壶都是空的:

{(0/10, 0/4, 0/2)}

然后我们尝试填充每个水壶,在队列中创建3个元素:

    fill up 10         fill up 4         fill up 2
{(10/10, 0/4, 0/2), (0/10, 4/4, 0/2), (0/10, 0/4, 2/2)}

然后我们拿(10/10, 0/4, 0/2),尝试填满4和2,并尝试将水从10转移到其他水壶中,创建以下元素:

    fill up 4          fill up 2      transfer 10 to 4  transfer 10 to 2
(10/10, 4/4, 0/2), (10/10, 0/4, 2/2), (6/10, 4/4, 0/2), (8/10, 0/4, 2/2)

然后将其添加到队列中:

{(0/10, 4/4, 0/2), (0/10, 0/4, 2/2), (10/10, 4/4, 0/2), (10/10, 0/4, 2/2), (6/10, 4/4, 0/2), (8/10, 0/4, 2/2)}

依此类推,直到我们在其中一个水壶中获得所需数量(我们实际上已经使用(8/10, 0/4, 2/2))。