Asked:2022-07-17 02:16:46 +0000 UTC2022-07-17 02:16:46 +0000 UTC2022-07-17 02:16:46 +0000 UTC
请帮助完成任务。关于计算器的任务与答案的恢复,这是我不能的答案的恢复
772
n = int(input())
F = [0] * (n + 1)
for i in range(2, n + 1):
F[i] = F[i - 1]
if i % 2 == 0:
F[i] = min(F[i], F[i // 2])
if i % 3 == 0:
F[i] = min(F[i], F[i // 3])
F[i] += 1
print(F[n])
если в ячейке n - 1 число на единицу меньше, то это нужный шаг
если n делится на 2 и в ячейке n // 2 число на единицу меньше, то это нужный шаг
если n делится на 3 и в ячейке n // 3 число на единицу меньше, то это нужный шаг
другого быть не может
向后找到步骤。打印时,它们需要扩展:
...
chain = []
while n > 1:
chain.append(n)
if F[n] == F[n - 1] + 1:
n -= 1
elif n % 2 == 0 and F[n] == F[n // 2] + 1:
n //= 2
elif n % 3 == 0 and F[n] == F[n // 3] + 1:
n //= 3
else:
assert False
chain.append(1)
print(*chain[::-1])
表中有足够的数据
F来恢复步骤链。对于 stepn,您可以像这样找到上一个:向后找到步骤。打印时,它们需要扩展:
c min 行会发生什么?对于给定值,选择哪个动作会导致最佳结果。
与其使用 min 函数,不如自己进行比较,这样除了选择最小值之外,还将您从给定的单元格中的编号写入并行列表(或使 F 成为列表的列表两个元素,其中第二个将包含您来自给定的单元格的编号)
通过后,从最后一个元素开始展开最佳路径