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

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

Флуд программистов
1181
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% студентов, учащихся на программистов так писать не смогут (я знаю, что говорю). Можно конечно сказать "вон из профессии". Но не всем же быть "художниками"! "Маляры" тоже нужны.
А держать команду, которая умеет так писать "с закрытыми глазами" что-то очень дорогое удовольствие.
Ну это так, офтопик, т.к. глаз зацепился за слово "сложно".
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем
Последние темы форумов
Быстровозводимые здания под ключ

Добрый день! Предлагаем Вам быстровозводимые здания для Вашего бизнеса! Мы проектируем и...
Цена: 800 000 руб.

Пресс-пакетировщик вертикальный Кубер-4ВА из стали AISI 304

Габарит формируемой кипы, мм 300х600х400 (ВхШхД) Габарит пресса, мм 1940х750х580 (ВхШхГ) Габарит модульной...
Цена: 793 000 руб.

Гальваническое цинкование металла

Предлагаем вам уникальную услугу по цинкованию металла, которая позволит значительно увеличить срок службы и защитить изделия от...

Комплексная автоматизация и цифровизация бизнеса под ключ.

Добро пожаловать в новую эру автоматизации бизнеса! Поможем вашему бизнесу стать более успешным, организованным и...
Цена: 500 000 руб.

Программист 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 лет, частичная занятость