【发布时间】:2016-08-24 03:04:06
【问题描述】:
我正在处理这个问题,这与找硬币问题非常相似。
我需要实现一个简单的计算器,它可以对当前数字 x 执行以下三个操作:将 x 乘以 2、将 x 乘以 3 或将 x 加 1。
目标给定一个正整数n,从数字1开始求得到数字n所需的最少操作次数。
我对此采取了一种贪婪的方法,但它显示的结果不正确
import sys
def optimal_sequence(n):
sequence = []
while n >= 1:
sequence.append(n)
if n % 3 == 0:
n = n // 3
elif n % 2 == 0:
n = n // 2
else:
n = n - 1
return reversed(sequence)
input = sys.stdin.read()
n = int(input)
sequence = list(optimal_sequence(n))
print(len(sequence) - 1)
for x in sequence:
print(x)
例如:
Input: 10
Output:
4
1 2 4 5 10
4 步。但正确的是 3 个步骤:
Output:
3
1 3 9 10
我阅读了有关动态编程的内容,希望可以在这里实现它。但是,在特定情况下我无法正确使用它,有人可以给我建议吗?
【问题讨论】:
-
动态编程的主要思想是重用你以后预先计算的东西。有没有办法让已经计算的较短序列可以帮助您更快地计算较长的序列?
标签: python dynamic-programming greedy