Форум сайта python.su
Имеется калькулятор, который выполняет три операции:
Прибавить к числу X единицу.
Умножить число X на 2.
Умножить число X на 3.
Определите кратчайшую последовательность операций, необходимую для получения из числа 1 заданное число N.
Входные данные:
Программа получает на вход одно число N, не превосходящее 106.
Выходные данные:
Выведите строку, состоящую из цифр “1”, “2” или “3”, обозначающих одну из трех указанных операций, которая получает из числа 1 число N за минимальное число операций. Если возможных минимальных решений несколько, выведите любое из них.
Мой код:
n = int(input()) x = 1 s = "" while x < n: if x*3 < n: x *= 3 s = s + "3" elif x*3 == n: s = s + "3" print(s) break elif x*2 < n: x *= 2 s = s + "2" elif x*2 == n: s = s + "2" print(s) break elif x+1 < n: x += 1 s = s + "1" elif x+1 == n: s = s + "1" print(s) break
Офлайн
Fiares_CurieПодход неправильный. Пиши рекурсивную функцию. Если сделаешь хвостовую рекурсию, то сможешь преобразовать её в цикл. Но я думаю, что тебе и рекурсии будет достаточно для прохождения.
Где ошибки?
Отредактировано py.user.next (Окт. 9, 2021 00:45:49)
Офлайн
Это задача из динамического программирования,т.е или по другому нахождение оптимального решения.Мне понимание динамического программирования плохо дается,прямо стена какая-то.
Понравилась цитата“ Динамическое программирование - это когда задачу,которую не понятно как решать,разбиваешь на более мелкие задачи,которые тоже не понятно как решать”
Вот и берем значит задачу типа
Fiares_Curie
Имеется калькулятор, который выполняет три операции:
Прибавить к числу X единицу.
Умножить число X на 2.
Умножить число X на 3.
Определите кратчайшую последовательность операций, необходимую для получения из числа 1 заданное число N.
num = int(input('>>>')) a = [0] * (num + 1) # для каждого числа пока заполняем по 0 операций a[1] = 0 # продублирую для наглядности чтобы получить 1 нужно 0 операций for n in range(2, num + 1): # для каждого числа из диапазона minimal = a[n - 1] + 1 # смотрим сколько потребовалось операций для предыдущего и прибавляем if n % 2 == 0: minimal = min(minimal, a[n // 2] + 1) # сравниваем сколько операций потребовалось для n//2+1 if n % 3 == 0: minimal = min(minimal, a[n // 3] + 1) # аналогично a[n] = minimal # заполняем вместо 0 количество операций
operations = [] i = num while i > 1: if a[i] == (a[i-1]+1): operations.insert(0, 1) i -= 1 continue if i%2 == 0 and a[i] == a[i//2]+1: operations.insert(0, 2) i //= 2 continue operations.insert(0, 3) i //= 3 print(a[num])# минимальное количество операций для num print(operations)# примененные операции
Офлайн