给定数字列表,在使用+ - * /获取特定结果时按顺序保留数字

时间:2011-07-08 05:03:43

标签: algorithm perl pseudocode

不确定之前是否曾询问过这个问题,但未能详细说明此类问题。

这是子集sum和背包的变体。

虽然类似的问题appears to have been asked before,但逻辑不同足以保证一个新的线程。

参数: 给出总数以及整数列表。 整数可以以任意多种方式组合(例如1 2 3 = 12,3或1,23或1,2 3) 允许3个操作:

  • 1加法
  • 1减法
  • 1师

示例:

1 2 9 3 7 4 = 22

解决方案:

(129 - 3) / 7 + 4 = 22

这种运动有分类吗? (例如,子集和等)

一些想法:

  1. 创建包含所有可能数字组合的多维数组。 由于只允许3个运算符,因此该数组将包含3列/元素。

  2. 在第1,2或3点随机插入操作符并强制执行直至找到解决方案。

  3. 这远远不是一个优雅的解决方案 任何见解都将不胜感激。

    我可能会用Perl编写代码,但任何语言的伪代码,指针或语法都会很棒。傲慢地嘲笑我缺乏数学资金也很酷;)

    提前致谢!

2 个答案:

答案 0 :(得分:1)

我刚刚回答了这个问题,但它被错误地迁移到了另一个stackexchange站点:https://codegolf.stackexchange.com/questions/3019/getting-an-answer-from-a-string-of-digits/3027#3027

  

这种运动有分类吗? (例如,子集和等)

我会称它为运算符+-*,{{1}找到列表的所有二元运算符“缩减”,以任意顺序应用}和/ / 10a+b


这是python中的暴力方法。在下面树木中的每个节点处,采用左侧和右侧可能性的笛卡尔积。对于每对,将所有运算符应用于它,以产生一组新的可能性。你必须小心不要做concat;你可以通过创建数字对象解决这个问题。

下面是加泰罗尼亚数字的图示,其中每个节点都是运营商。操作次数大致为(1-2)3 = -13。如果Catalan(#digits-1) * #operators^(#digits-1)那么它应该只有大约十亿件事要尝试。

enter image description here

使用How to print all possible balanced parentheses for an expression?我们可以写:

#digits=10

答案 1 :(得分:0)

一种似乎运作良好的简单蛮力方法。

让我们使用RPN来避免括号。将输入拆分为单个数字,并尝试在数字之间插入运算符(无:空格和算术运算符),直到结果字符串求值为目标值。

javascript中的插图:http://jsfiddle.net/B5NdN/4。我只是从0循环到6 ^(输入长度​​)以获得所有可能的运算符组合,你的任务可能需要更复杂的东西,但原则仍然存在。