我正在尝试提出一种适用于以下情况的算法:
以下是一个例子:
Jug 1 = 10 capacity
Jug 2 = 4 Capacity
Jug 3 = 2 capacity
目标是在任何一个水壶中都有8个
我需要确定它是否可能,如果是的话,我需要提供我使用的移动序列。请记住,我有一个无限制的水壶,“目标”由用户决定。
答案 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)
)。