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

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

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

Команда специалистов ООО БАРТОН предоставляет качественные услуги лазерной резки металла в Нижнем Новгороде на профессиональном...

Амперметр цифровой амперметр ЦА-2131 .

Амперметр Прибор - цифровой амперметр ЦА-2131 Отправка в регионы после оплаты В работе не были - НОВЫЕ. Питание 220 вольт ЦА-2131...
Цена: 2 000 руб.

Пеcкoразбрacыватель. КДМ

Пpодaм полуприцeп тракторный РС 03 . Oбоpудование pаcпpедeляющee пoлупpицeпное. Пеcкoразбрacыватель. КДМ. Поливомоечнoe обоpудoвaние нa...
Цена: 500 000 руб.

Конденсатор Ионистор Производитель: Elna

Ионистор Производитель: Elna America 22 штуки. Цена 250 рубшт. Супер конденсатор Ионисторы 1F*5,5 V ELNA 1 Ф, 5.5 В 1 фарад =...
Цена: 250 руб.

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