Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在不使用暴力和/或大量计算时间的情况下解决此问题?_Python_Algorithm_Computation - Fatal编程技术网

Python 如何在不使用暴力和/或大量计算时间的情况下解决此问题?

Python 如何在不使用暴力和/或大量计算时间的情况下解决此问题?,python,algorithm,computation,Python,Algorithm,Computation,我正在尝试解决以下问题: A store sells large individual wooden letters for signs to put on houses. The letters are priced individually. The total cost of letters in LOAN is 17 dollars. The total cost of letters in SAM is 18 dollars. The total cost of letters in

我正在尝试解决以下问题:

A store sells large individual wooden letters for signs to put on houses. 
The letters are priced individually.
The total cost of letters in LOAN is 17 dollars.
The total cost of letters in SAM is 18 dollars.
The total cost of letters in ANNA is 20 dollars.
The total cost of letters in ROLLO is 21 dollars.
The total cost of letters in DAMAGES is 30 dollars.
The total cost of letters in SALMON is 33 dollars.

How much would the letters in the name GARDNER cost?
我用下面的python代码强制字母花费,但它需要花费数小时才能收敛,因为它们有33^10种可能的组合需要测试。我使用n=33,因为它是一个名称的最大成本,但实际上,n可以减少到15甚至10,但如果不加sur,它将收敛

def func(letters):
    print letters
    if letters['L']+letters['O']+letters['A']+letters['N'] != 17:
        return False
    elif letters['S']+letters['A']+letters['M'] != 18:
        return False
    elif 2*letters['A']+2*letters['N'] != 20:
        return False
    elif letters['R']+2*letters['O']+2*letters['L'] != 21:
        return False
    elif letters['D']+2*letters['A']+letters['M']+letters['G']+letters['E']+letters['S'] != 30:
        return False
    elif letters['S']+letters['A']+letters['L']+letters['M']+letters['O']+letters['N'] != 33:
        return False
    return True

def run(letters, n, forbidden_letters):
    for letter in letters.keys():
        if letter not in forbidden_letters:
            for i in range(1, n):
                letters[letter] = i
                if not func(letters):
                    if letter not in forbidden_letters:
                        forbidden_letters+=letter
                    if run(letters, n, forbidden_letters):
                        return letters
                else:
                    return letters

LETTERS = {
    "L":1,
    "O":1,
    "A":1,
    "N":1,
    "S":1,
    "M":1,
    "R":1,
    "D":1,
    "G":1,
    "E":1,
}
n=33
print run(LETTERS, n, "")
暴力强迫最终会起作用,但它占用了大量CPU,因此肯定不是最佳解决方案

有谁有更好的办法来解决这个问题吗?要么通过减少计算时间,要么通过良好的数学方法


谢谢大家。

这就是所谓的线性方程组。如果需要,可以手动求解,但也可以使用线性解算器。比如说sympy

import sympy

l,o,a,n,s,m,r,d,g,e = sympy.symbols('l,o,a,n,s,m,r,d,g,e')

eq1 = l+o+a+n - 17
eq2 = s+a+m -18
eq3 = a+n+n+a -20
eq4 = r+o+l+l+o -21 
eq5 = d+a+m+a+g+e+s -30
eq6 = s+a+l+m+o+n- 33

sol, = sympy.linsolve([eq1,eq2,eq3,eq4,eq5,eq6],(l,o,a,n,s,m,r,d,g,e))
l,o,a,n,s,m,r,d,g,e = sol

print(g+a+r+d+n+e+r)
线性方程组可以很快求解。复杂性是O(n3),其中n是变量的数量。所以对于这样一个小问题,它几乎是瞬间的

L + O + A + N - 17 = 0
S + A + M - 18 = 0
2 * A  + 2 * N - 20 = 0
等等

尝试制作如下矩阵:

 L O A N S M R D G E val
[1 1 1 1 0 0 0 0 0 0 -17 | 0] LOAN
[0 0 1 0 1 1 0 0 0 0 -18 | 0] SAM
[0 0 2 2 0 0 0 0 0 0 -20 | 0] ANNA
...
[0 0 1 1 0 0 2 1 1 2 -x | 0] GARDENER

现在,您可以使用例如高斯方法来解决它。这需要O(n^3)时间复杂度。

这是一个线性方程。谢谢,我认为10个未知变量和6个方程不足以用这种方法求解。无可否认,加德纳中的一些字母有奇怪的价格,但它分解为一个数字。似乎有些字母值没有被分解(例如“O”、“m”、“g”或“e”),但是,由于它们以“gardner”的名称相互减除…感谢您的解决方案,它确实解决了“gardner”名称的问题,但我们无法访问所有单个字母值,无论如何,它得到了很好的解决,我不知道它们是否有其他方法可以访问所有值而无需强制