米杯,倒水,图算法,n =(a1 + 1)(a2 + 1)...(am + 1)

时间:2014-12-11 10:15:08

标签: algorithm

这个问题困扰了我很久。我认为解决方案应该是图算法。非常感谢

给出m杯c1; C2; ; cm,整数容量为a1; a2; ::: ;;我是分别。你才被允许 执行以下三种操作:

  1. 完全填满一个杯子。
  2. 倒空一杯。
  3. 将杯子ci中的水倒入杯子cj,直到ci为空或cj已满。
  4. 从所有杯子都空的状态开始,您希望达到最终状态 杯子c1有x毫升水,所有其他杯子都是空的(对于某些给定的x)。设计算法以查找所需的最小操作数或报告无法访问所需的最终状态。 你的算法必须在n =(a1 + 1)(a2 + 1):::(am + 1)中以时间多项式运行。

1 个答案:

答案 0 :(得分:0)

假设c1的容量为5升,而c2的容量为3升。他们的差异是2升。 所以可以通过以下步骤在任何杯子c1或c2中取2升水 - 1)填充c1即5升。 2)倒入c2直到它满了。 3)空c2。 4)你在c1中有3升。

对于这些m杯,你有m选择2 = m!/(m-2)!2! = m * m-1/2组合。 计算所有这些并将其填入哈希表中并同时进行操作。 因为2升可以容量一杯也差2杯容量。我们存储operation = 1而不是3。

现在我们有了所有可能的水升数的散列集,我们可以在没有操作的情况下持有这些水。 您只需要从该最小操作集合中找到最小长度子序列。