--}}
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем

Задачка про зайчика

Флуд программистов
1189
23
С друзьями на NN.RU
В социальных сетях
Поделиться
Есть интересная задачка про зайчика. Полный текст:
В нашем зоопарке появился заяц. Его поместили в клетку, и чтобы ему не было скучно, директор зоопарка распорядился поставить в его клетке лесенку. Теперь наш зайчик может прыгать по лесенке вверх, перепрыгивая через ступеньки. Лестница имеет определенное количество ступенек N. Заяц может одним прыжком преодолеть не более К ступенек. Для разнообразия зайчик пытается каждый раз найти новый путь к вершине лестницы. Директору любопытно, сколько различных способов есть у зайца добраться до вершины лестницы при заданных значениях K и N. Помогите директору написать программу, которая поможет вычислить это количество. Например, если K=3 и N=4, то существуют следующие маршруты: 1+1+1+1, 1+1+2, 1+2+1, 2+1+1, 2+2, 1+3, 3+1. Т.е. при данных значениях у зайца всего 7 различных маршрутов добраться до вершины лестницы.
Для проверки: 1 и 3 = 1 вариант, 2 и 7 = 21 вариант, 3 и 10 = 274 варианта

Количество способов я посчитал. Возникла мысль вывести список маршрутов (т.е. 1+1+1+1 и пр.). И вот тут чет приуныл. Есть идеи?
Meg@VaD
19.01.2016
А какие средства вывода доступны?
Мне бы алгоритм формирования этого списка.. как выводить неинтересно.
Meg@VaD
19.01.2016
Ааа)) Так "количество способов я посчитал" на форуме разработчиков ПО выглядит, будто алгоритм-то уже есть ;) Как считал, так и формируй, в чём конкретно проблема-то?
Я посчитал количество не формируя сами наборы. Вот код если интересно pastecode.ru/e1a306/
Labutin
19.01.2016
Можно рекурсивно попробовать. Вроде глубина рекурсии будет не больше длины лестницы. При небольших входных данных прокатит (стека хватит) и работать будет относительно быстро.

Значительно медленней - полный перебор ( 2**N вариантов) даже не предлагаю.

Без глубокого погружения предположу примерно такой вариант.
Внешний цикл по i от N до N / K (правильно округлить) - это то, за сколько прыжков заяц до верха доберется.
Потом лестницу представляем как массив ступенек где 0 - заяц не вставал на ступеньку, 1 - вставал пока прыгал до верха. И расставляем i единичек при условии что нет больше и равного K нулей подряд.
Каждый вариант преобразуем в вывод варианта прыжков.
Например, вариант для 6-ти ступенек:
1 0 0 1 0 1
это соответствует выводу 1 + 3 + 2
Meg@VaD
19.01.2016
Значит тебе надо другой способ. А твой старый сродни
umk.portal.kemsu.ru/uch-mathematics/papers/posobie/r2-3.htm
почитай, в будущем сэкономишь время :) Когда надо будет чисто кол-во вычислить. И наглядней будет код.
Спасибо, 13 лет спустя тервер наконец пригодился
diper
19.01.2016
.
Spirit-1
19.01.2016
Элементарно. См. динамическое программирование. Перебираешь последний шаг для i=1..К и к нему добавляешь решение для подзадачи при N1 = N-K.
Ага... я вчера тоже прочитав первый пост, минут 10 порисовал, и что-то мне это напомнило из древности - кажется алгоритм Дейкстры, если не ошибаюсь)
Так и получилось в реализации. Решение в последнем элементе массива, каждый элемент массива равен сумме предыдущих.
Labutin
20.01.2016
Да, это идеально и быстро работает, чтобы подсчитать количество вариантов. Но вот чтобы вывести все варианты - тут не все так просто.
Spirit-1
20.01.2016
Ничего сложного, передавайте рекурсивно уже найденное окончание последовательности.
henry
19.01.2016
захардкодить подмаршруты для всех вариантов меньше К,
генерить цепочки маршрутов исходя из количества К в N.
Т.е. 1+1+1 + 1 или 3 + 1 ( где "+ с пробелами по бокам" - разделитель цепочек).

(Предложенный алгоритм не смотрел - исходил из сочетаний шагов в К и сочетаний этих К-сочетаний в N)
Labutin
20.01.2016
Если в лоб рекурсивно, то как-то так: https://github.com/Labutin/JumpingRabbit/blob/master/Rabbit.go
Сделал добавив в исходный код формирование маршрутов. Всем спасибо :)
Пацаны, что-то сложное накрутили.

весь код в трех строках

from functools import reduce

def S(n,k):
if n >= k: return 2**(k-1)
return reduce(lambda s, i: s + S(n, k - i - 1), range(n), 0)


Проверяем:

>>> S(2,7)
21
>>> S(3,10)
274
>>> S(1,3)
1
>>>

ЗЫ: язык - питон, форум сожрал отступы.
А S(1,1) == 0?
$ python
>>> from functools import reduce
>>>
>>> def S(n,k):
if n >= k: return 2**(k-1)
return reduce(lambda s, i: s + S(n, k - i - 1), range(n), 0)

>>> S(1,1)
1
>>>
Да я тупанул немного, ** возведение в степень, а не умножение. Очень лаконичное решение у Вас получилось. А маршруты нарисовать?
Вся магия в том что удалось добавить немного математики и спрятать цикл в reduce.

Если выводить маршруты, то алгоритм будет тот же самый что и выше. Разве что можно еще добавить шаманства за счет питоновских генераторов.
Labutin
28.01.2016
Понятие "сложно накрутили" очень относительное.
Я сам в восторге от функционального программирования (Scala, Haskel), но 90% моих знакомых программистов такое никогда не напишут. Поймут конечно, но так писать не смогут. Не то, чтобы не хотят - именно не смогут. Более того, 90% студентов, учащихся на программистов так писать не смогут (я знаю, что говорю). Можно конечно сказать "вон из профессии". Но не всем же быть "художниками"! "Маляры" тоже нужны.
А держать команду, которая умеет так писать "с закрытыми глазами" что-то очень дорогое удовольствие.
Ну это так, офтопик, т.к. глаз зацепился за слово "сложно".
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем
Универсальный фрезерный станок 6В75

Станок фрезерный широкоуниверсальный 6В75 Рабочая поверхность стола, мм длина х ширина 500х195 ( 200) Наибольшее перемещение, мм...

Горизонтально-фрезерный станок 6м82

Предназначен для фрезерования плоскостей небольших деталей различной конфигурации из стали, чугуна и цветных металлов цилиндрическими,...

Вертикально-фрезерный станок 6Т13-35

Вертикально-фрезерный станок 6Т13-35 технические характеристики 6Т13 размеры стола, мм 1600x400 перемещение стола, мм -...

Универсальный фрезерный станок ОФ-55(ФС-250)

Универсальный фрезерный станок ОФ-55(ФС-250)

Программист 1С НПП ПРО-М
от 110 000 руб.
Высшее образование, стаж работы 3-5 лет, полная занятость
Разработчик .net Profit Search
70000 -
100000 руб.
Неполное среднее образование, стаж работы 3-5 лет, полная занятость
Программист-разработчик Full-Stack ГК "Kolobox"
70000 -
100000 руб.
Высшее образование, стаж работы более 5 лет, полная занятость
Frontend-разработчик Profit Search
40000 -
50000 руб.
Стаж работы 3-5 лет, частичная занятость