我想问你如何获得我必须要做的操作列表才能获得结果。
简单的例子:
有一个数字N.你的目标是找出你必须做的最小操作(x / 3,x / 2,x-1)才能得到1。
所以例如minop(10)= 3(因为 1。 10-1 = 9, 2。 9/3 = 3, 3. < / strong> 3/3 = 1)。
这个函数非常简单,在Python中采用自下而上的方法:
# the opt is an optimum nuber of operations for index to get to one
# the op list should be a list of operations but it does not work
# correctly. For minop(10) would return opt = 3 (three
#operations), op = [1,3,3] (minus one, divide three, divide three)
opt = [0,0,0,0,0,0,0,0,0,0,0,0] # optimum number of operation for i
op = []
def minop(n):
opt[1]=0
for i in range(2,n+1):
opt[i]=opt[i-1]+1
op.append(1) # INCORRECT
if i%2==0:
opt[i] = min(1+opt[i/2],opt[i])
op[-1]=2 # INCORRECT
if i%3==0:
opt[i] = min(1+opt[i/3],opt[i])
op[-1]=3 # INCORRECT
return opt[n],op
正如您所看到的,操作列表应包含从n
到1
所需的最小操作列表(由数字表示),但它包含。
答案 0 :(得分:1)
代码中最重要的错误是,即使操作没有产生更好的结果,您也会在opt[i]
块中更新if
。
以下是您的代码的更正版本:
def minop(n):
op = [[], []]
for i in range(2,n+1):
ref = i-1
best = 1
if i%2==0 and len(op[i/2]) < len(op[ref]):
ref = i/2
best = 2
if i%3==0 and len(op[i/3]) < len(op[ref]):
ref = i/3
best = 3
op.append([best] + op[ref][:]) # slice to get separate copy
return len(op[n]), op[n]
print minop(10)
输出:
(3, [1, 3, 3])
含义:3个操作,-1
,/3
,/3
。