具有4个基本运算的表达式的组合

问题描述 投票:1回答:2

我无法提出一个更好的标题,因为适当的标题可能需要整个解释。而且,由于问题将涉及排列,因此组合可能会产生误导。

我要完成的工作是在以下问题上胜过Python中的蛮力方法:给定4个基本运算[+,-,*,/]和1到9的数字,并给出所有可能的组合5位数字和4个无重复(排列)的运算导致给定的数字(视为整数),例如1 + 5 * 9-3 / 7 = 45、1-2 / 3 + 9 * 5 = 45, ...获得从最小可能值到最大可能值的所有整数,并找出在空间扩展中是否存在所有整数。

我对暴力的初步尝试如下:

def brute_force(target):
    temp = 0
    x = [i for i in range(1,10)]
    numbers = [str(i) for i in x]
    operators = ["+","-","*","/"]
    for values in permutations(numbers,5):
        for oper in permutations(operators):
            formula = "".join(o + v for o,v in zip([""]+list(oper),values))
            if round(eval(formula)) == int(target):
                temp += 1
    if temp > 0:
        return True
    else:
        return False

for i in range(-100,100):
    total = brute_force(i)
    if total:
        print(i)
    else:
        print(str(i) + 'No')

它仅会打印出未找到的整数以外的'No'。显而易见,所有整数值都可以在-71到79之间的空格中找到。

我既是使用Python还是使用算法实现的新手,但从涉及置换的事实来看,我认为该算法具有复杂度O(n!)。但是,如果不是这种情况,我仍然想要一种性能更好的算法(例如递归或动态编程)。

我无法提出一个更好的标题,因为适当的标题可能需要整个解释。而且,由于问题将涉及排列,因此组合可能会产生误导。我想...

python algorithm permutation
2个回答
1
投票

首先,让我们分析一下表达式。您有三项:乘积P(A * B),商Q(A / B)和标量S。您可以将它们与加法和减法结合使用。


1
投票

我想您只需要找到排列一次。从所有可能的总和中创建一个集合。然后进行查找。仍然有点蛮力,但是可以节省很多重复的计算。

© www.soinside.com 2019 - 2024. All rights reserved.