获得最短的序列以达到一个数字(+, - ,*,/)

时间:2016-05-16 17:54:12

标签: algorithm

我正在完成一项任务: 程序获取一个数字作为输入,输出将是从0到达该数字所需的步数。 规则:

  • 执行顺序是从左到右,所以+, - ,*和/都是 相等。
  • 如果数字变为负数,则会增加10 000(仅通过0 - 4可以获得数字999)
  • 如果partresult超过10000,程序只会记住最后4位
  • 只有在结果是积分的情况下才能进行除法(5/4不可能)
  • 您只能使用4号

示例输入:

42

示例输出:

9

最短的解决方案是:

 4 + 4 + 4 * 4 - 4 * 4 - 4 - 4 / 4

我并不真正需要整个解决方案,所以如果你能把我推向正确的方向,我们将非常感激。

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

我通常会从"天真"开始思考。解决方案,并尝试改进想法。

MOST NAIVE

  1. 使用" 4"构建一棵树以root身份,每个节点分支为4(每个操作)
  2. 逐级构建树,直到找到想要获得的数字。
  3. e.g。
    Lv1:4
    Lv2:4 + 4 = 8,4-4 = 0,4 * 4 = 16,4 / 4 = 1 Lv3:8 + 4,8-4,8 * 4,8 / 4 ,, 0 + 4,0-4,0 * 4,0 / 4 ...... ...

    当然:这具有指数级的复杂性,这是非常糟糕的。

    解决方案增强

    我们可以看到很多分支都是" DEAD-ENDS"可以削减。 而且,一些(很多)数字会重复,他们的分支可以被重复使用'

    换句话说:
    为数字X创建节点时,将新节点保存在X,下的哈希值中 当你最终遇到X时,不是创建一个新节点,而是将它指向已经创建的节点 注意:此分支已停止,因为它正在循环,已知值。

    我没有时间对此解决方案的复杂性进行建模,但对于大多数数字而言,它应该是可行的解决方案。

    此外

    如果我们仔细观察,我们可以很容易地看到这棵树不会改变每个函数调用,对于任何一个数字...只有增长和扩展,
    因此,在前几次运行之后,我们更有可能在我们的" hash"中找到所需的数字。 @〜O(1),
    如果它不存在,那么如果我们没有,我们会更接近它。

    完全不同(但不完整)的方法

    这个想法并没有完成,但我认为值得你提一下 我们或许可以通过贪婪的方法逃脱:

    • x*4 < N
    • 一样乘以4
    • 只要x+4<N
    • 添加4
    • 4/4 = 1 =&gt;相应地添加3,2,1。

    注意:您需要在此处考虑订单问题,以及数字可以包含在10,000左右的事实。

    但这是一个开始。