Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 水壶的算法?_Algorithm_Language Agnostic - Fatal编程技术网

Algorithm 水壶的算法?

Algorithm 水壶的算法?,algorithm,language-agnostic,Algorithm,Language Agnostic,我试图提出一种算法,适用于以下情况: 无限数量的水壶 每个水罐都有其最大容量 目标是要有一定数量(x)的水壶之一 以下是一个例子: Jug 1 = 10 capacity Jug 2 = 4 Capacity Jug 3 = 2 capacity 目标是在任何一个罐子里装8个 我需要确定是否可能,如果可能,我需要提供我使用的移动顺序。请记住,我有一个无限量的水壶,而“目标”由用户决定。可能有更有效的方法,但我会选择某种方法 开始时所有的罐子都是空的 在每个步骤中,尝试填满每个(未满的)水罐,并

我试图提出一种算法,适用于以下情况:

  • 无限数量的水壶
  • 每个水罐都有其最大容量
  • 目标是要有一定数量(x)的水壶之一
  • 以下是一个例子:

    Jug 1 = 10 capacity
    Jug 2 = 4 Capacity
    Jug 3 = 2 capacity
    
    目标是在任何一个罐子里装8个


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

    可能有更有效的方法,但我会选择某种方法

    开始时所有的罐子都是空的

    在每个步骤中,尝试填满每个(未满的)水罐,并尝试将其中一个非空水罐中的所有水转移到另一个水罐(直到该水罐满了或我们没有水)-这些操作中的每一个都可以被认为是当前状态(或节点)到另一个状态(或节点)之间的边缘-如果您熟悉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)}
    
    {(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)}
    
    然后,我们取
    (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)
    
    然后将其添加到队列中:

        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)}
    
    {(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)
    )。

    这是编程竞赛的问题吗?我只是想问一下,这样我就可以给它贴上标签了。我还将删除语言标签,因为你的问题本质上是语言不可知论的。而且,你没有提出问题。如果问题中没有问号,这总是可疑的。实际上,这听起来更像是一个算法类的作业。你能告诉我们你试过什么吗?嗨,这是一个编程问题,不是专门为比赛。我在问解决这个问题的算法是什么。看,这就是为什么我要问这个问题。我想你的意思是:我能把任何罐子装满液体。除了别人给我的水罐,我没有其他方法来测量液体。因为我不能在不装满水罐的情况下测量液体,所以问题是如何使用提供的水罐在水罐中获得8升液体。例如,给定容量分别为10升、4升和2升的罐子,我首先将10罐装满,然后将10罐中的液体装满2罐,10罐中只剩下8罐。但是,您尚未指定此项。你假设人们理解你的意思,看起来这会随着罐子的数量而爆炸,但是OP没有指定任何输入限制。如果第一个罐子(可以按任何顺序)装满了,会怎么样?这会改变算法很多吗?@user3220348开始状态只会改变队列中以
    (10/10,0/4,0/2)
    开始的元素,而不是
    (0/10,0/4,0/2)
    。如果你从水罐中的所有液体开始,而不是有无限的液体来源,你将跳过“尝试装满每个(未装满的)水罐”步骤,因为这是假设从该来源取水,然后它应该可以很好地工作。@user3220348:请以一种可以理解的形式重申您的问题,并包含所有信息,特别是开始状态是什么,您可以拥有多少个罐子,以及您可以执行哪些动作。否则你就是在浪费每个人的时间