我被这个问题陈述所困扰,我的代码确实有效,但我使用itertools.permutations
了它,这使得它非常慢。此外,我不知道如何使它适用于所有或任何输入。我想我必须使用回溯,但我没有在这里使用如何使用它。
欢迎任何有价值的建议或建议或代码。是的,这是一项任务,我不是要完整的代码。谢谢!
这是问题陈述:
用不同的数字(0, 1, 2, .., 9)代替下面的不同字母,这样对应的加法正确,得到的MONEY值尽量大。价值是什么?
SHOW + ME + THE = 钱
有 3 个解满足方程:10376、10267、10265。因此,正确的一个是(最大的)10376。如果有多个映射评估为相同的最大值,则将它们全部输出。
那作业:
用 Python 写一个程序,总能找到这类问题的正确解决方案。
import time
import itertools
def timeit(fn):
def wrapper():
start = time.clock()
ret = fn()
elapsed = time.clock() - start
print("%s took %2.fs" % (fn.__name__, elapsed))
return ret
return wrapper
@timeit
def solve1():
for s in range(1, 10):
for e in range(0, 10):
for n in range(0, 10):
for d in range(0, 10):
for m in range(1, 10):
for o in range(0, 10):
for r in range(0, 10):
for y in range(0, 10):
if distinct(s, e, n, d, m, o, r, y):
send = 1000 * s + 100 * e + 10 * n + d
more = 1000 * m + 100 * o + 10 * r + e
money = 10000 * m + 1000 * o + 100 * n + 10 * e + y
if send + more == money:
return send, more, money
def distinct(*args):
return len(set(args)) == len(args)
@timeit
def solve2():
#letters = input("Enter your string: ")
#letters1 = list(letters)
letters = ('s', 'h', 'o', 'w', 'm', 'e', 't')
digits = range(10)
for perm in itertools.permutations(digits, len(letters)):
sol = dict(zip(letters, perm))
if sol['s'] == 0 or sol['m'] == 0:
continue
send = 1000 * sol['s'] + 100 * sol['e'] + 10 * sol['n'] + sol['d']
more = 1000 * sol['m'] + 100 * sol['o'] + 10 * sol['r'] + sol['e']
money = 10000 * sol['m'] + 1000 * sol['o'] + 100 * sol['n'] + 10 * sol['e'] + sol['y']
if send + more == money:
return send, more, money
print(solve1())
print(solve2())