Algorithm 获取到达数字的最短序列(+;,-,*,/)

Algorithm 获取到达数字的最短序列(+;,-,*,/),algorithm,Algorithm,我正在做一项任务: 程序得到一个数字作为输入,输出是从0到该数字所需的步数。 规则: 执行顺序是从左到右,所以+、-、*和/都是 平等 如果数字为负数,则添加10000(您只需执行0-4即可获得数字9996) 如果partresult大于10000,程序只记住最后4位数字 只有结果为整数时才能进行除法(不可能为5/4) 您只能使用数字4 输入示例: 42 示例输出: 9 最短的解决方案是: 4 + 4 + 4 * 4 - 4 * 4 - 4 - 4 / 4 我真的不需要整个解决方案,

我正在做一项任务: 程序得到一个数字作为输入,输出是从0到该数字所需的步数。 规则:

  • 执行顺序是从左到右,所以+、-、*和/都是 平等
  • 如果数字为负数,则添加10000(您只需执行0-4即可获得数字9996)
  • 如果partresult大于10000,程序只记住最后4位数字
  • 只有结果为整数时才能进行除法(不可能为5/4)
  • 您只能使用数字4
输入示例:

42
示例输出:

9
最短的解决方案是:

 4 + 4 + 4 * 4 - 4 * 4 - 4 - 4 / 4
我真的不需要整个解决方案,所以如果你能把我推向正确的方向,我将不胜感激


谢谢您的时间。

我通常从“天真”的解决方案开始思考,并尝试改进这些想法

最天真
  • 构建一个以“4”为根的树,每个节点分支为4(对于每个操作)
  • 一层一层地建立这棵树,直到你找到你想要的数字
  • e、 g.
    1级:4级
    二级:4+4=8,4-4=0,4*4=16,4/4=1
    三级:8+4,8-4,8*4,8/4,0+4,0-4,0*4,0/4。。。

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

    溶液增强 我们可以看到,许多分支都是“死胡同”,可以被切断。 此外,一些(许多)数字会重复出现,它们的分支可以“重用”

    换句话说:
    为编号X创建节点时,将新节点保存在X下的哈希中,
    当最终遇到X时,不要创建新节点,而是将其指向已创建的节点。
    注意:此分支已中断,因为它正在循环通过已知的值

    我没有时间对这个解决方案的复杂性进行建模,但对于大多数数字来说,它应该是可行的解决方案

    此外 如果我们仔细观察,我们可以很容易地看到,这棵树不会因每次函数调用而改变,无论是对于哪个数字。。。仅增长和扩展,
    因此,在前几次运行之后,我们更有可能在“hash”@~O(1)中找到请求的数字,
    如果它不存在,那么如果我们不存在,我们就离它更近了

    完全不同(但不完整)的方法 这个想法并不完整,但我认为值得一提,以便您进一步展开。
    我们或许可以通过贪婪的方式逃脱:

    • 乘以4,只要
      x*4
    • 添加4,只要
      x+4相应地添加3,2,1
    注意:您需要考虑这里的订单问题,以及数字可以包装在10000左右的事实


    但这只是一个开始。

    这是你的任务吗?这就是为什么我不要求一个完整的解决方案,只是一个方向。我完全迷路了。@Raxume谢谢你接受我的答案:)所以建议在接受答案之前让24-48小时过去,这是为了鼓励其他人也回答,然后选择最合适的答案:)这是我创建的程序,它可以工作,但在某些输入(例如9501、8323)时失败。你觉得怎么样?谢谢你的时间。我没有读程序,但是什么失败了?它找不到价值?崩溃还有什么?值是错的-没有崩溃,没有无限循环。为什么错了?找到一条更短的路了吗?你有没有试着打印“痕迹”,但它计算错了?这就是问题所在,我不知道为什么,8323有痕迹