你有三件事
1)'n'正和负整数数组。 2)数字'x'。 3)运算符:'+',' - ','%','/'
使用数组形成表达式,以便在计算时,结果变为“x”。
例如,考虑数组[5,3,-1,6,2,3]和x = 2,一种可能的解决方案是
5/3 +( - 1)+ 6/2 - 1
假设5/3的结果为1(始终为整数除法)。
我有一个更复杂的变种。
在此问题的复杂变体中,假设BODMASS规则不适用。所以,在任何时候你遍历元素'm'并且你有中间结果'y'。您可以将任何运算符应用于'y'和[m + 1]。
例如,在变体1中,
5 + 3 - 2/2 = 7(首先评估2/2,所以5 + 3 - 1)
在变体2中,
5 + 3 - 2/2 = 3(5 + 3 = 8.阵列减少到8-2 / 2。现在,8 -2 = 6.并且阵列减少到6/2,评估为3)。
Algo / Math / DS专家?
这是NP难吗?
答案 0 :(得分:2)
有4个运算符,因此对于一组n个项,您有4 ^(n-1)个可能的值。您可以构建搜索空间的图形,其中每个路径表示一组运算符值,结束点是计算结果。
在所有这些终点中,只有那些给出正确答案的终点才会在正确的终点结束。
但请注意,如果从终点开始,则可以向后移动;只有拥有一组有效的运算符才会以第一个值结束。
所以从两端遍历它,两个计算将在中间相遇。这是一个小得多的空间,每个方向的空间为4 ^(n / 2)= 2 ^ n。要匹配这两组答案,您需要对中间列表进行排序,尽管您可能希望在每一步都执行此操作,以防止出现重复路径。在这一点上,它看起来很像一个迷宫遍历。
一个已知的NP完全问题是Boolean satisfiability的问题,这是“确定给定布尔公式的变量是否可以以使公式求值为TRUE的方式分配的问题”。我怀疑,因为搜索空间明显大于布尔可满足性问题,并且由于解决方案也会确定公式是可满足的(因此至少与解决可满足性一样难),那么问题应该是是NP完全的。
在迷宫意义上,其值偏离零的部分解决方案不太可能是正确的解决方案,并且给定参数的初始扫描,应该清楚大小的限制(即所有乘法),在布尔问题中并非如此。
编辑:澄清我在开头提到的树。假设我们的列表是
1 ? 2 ? 5 = X
然后图表是这样的:
r1 --> r2 ---> r3 (X)
1 +2 3 +5 8
-5 -2
*5 15
/5 0
-2 -1 +5 4
-5 -6
*5 -5
/5 0
*2 2 +5 7
-5 -3
*5 10
/5 0
/2 0 +5 5
-5 -5
*5 0
/5 0
如您所见,如果X为-5,那么它可以是1 -2 * 5或1/2 -5。向后工作,从-5:
-5 +5 0
-5 -10
*5 -25
/5 -1
因此,如果我们从每一端走过,我们将处于中间列,唯一的常见值将是-1和0,产生两个路径,其中8个计算而不是16个仅在一个方向上进行。< / p>
我提到的一个点,就是整数除法不是1:1的映射,所以后退是不明确的; -4/5 - &gt; 0,-3 / 5 - &gt; 0等至4/5 - &gt; 0是最坏的情况,因为它从0的任一侧接近,但即使是20/10到29/10也都映射到相同的值,2。这是一个很大的障碍;当向后踩到被分割的数字的大小时,它会增加可能的节点数,因此对于5,有3 + 5 = 8个可能的状态而不是4。
答案 1 :(得分:0)
这是尝试递归解决方案(对于简单版本):
Gen {'x'} = {'x'}
Gen {'x', 'y'} = {'x + y', 'x - y', 'y - x', 'x / y', 'y / x', 'x % y', 'y % x'}
S0 = {a[0]}
Gen S(i + 1) = {j ∈ S(i) | Gen {j, a[i + 1]}}
最终答案是:∃ j ∈ S(n). x = [[ j ]]
也就是说,我们逐步构建所有可能的值(作为表达式),然后最终评估所有这些值以查看其中一个是否可以生成x
(评估可以逐步进行)同样)。
但是,在这里我假设构建表达式时a
的值是线性使用的。我意识到你的问题不是这样......