【发布时间】:2019-08-08 02:39:51
【问题描述】:
我正在尝试解决以下问题:
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,但不会收敛。
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 资源,肯定不是最佳解决方案。
有没有人有更好的解决方案来解决这个问题?要么通过减少计算时间,要么通过良好的数学方法。
谢谢大家。
【问题讨论】:
-
它是一个线性方程。
标签: python algorithm computation