вівторок, листопада 29, 2005

Задача про скобки

Задача: в выражении раставить скобки таким образом чтоб результирующие выражение было максимальным

Решение: Посути нужно найти порядок в котором будет вычеслятся выражение, всего же число вариантов равно n! где n число операций в выражении
набросок решения

#!/usr/bin/python

def solve(d,o,v):
if len(o)==0:
print "%s = %s" % (d[0],v[0])
for i in range(len(o)):
if o[i]=="*":
nv = v[:i] + ( v[i]*v[i+1],) + v[i+2:]
elif o[i]=="+":
nv = v[:i] + ( v[i]+v[i+1],) + v[i+2:]
elif o[i]=="/":
nv = v[:i] + ( v[i]/v[i+1],) + v[i+2:]
elif o[i]=="-":
nv = v[:i] + ( v[i]-v[i+1],) + v[i+2:]

solve(d[:i]+("(%s%s%s)" % (d[i],o[i],d[i+1]),)+d[i+2:],o[:i]+o[i+1:],nv)

digits=(1,2,3,4)
opps=("+","*","+")
solve(digits,opps,digits)

вывод:

(((1+2)*3)+4) = 13
((1+2)*(3+4)) = 21
((1+(2*3))+4) = 11
(1+((2*3)+4)) = 11
((1+2)*(3+4)) = 21
(1+(2*(3+4))) = 15

осталось только выбрать из них максимальный вариант

Немає коментарів: