Лесенкой называется набор кубиков, в котором каждый более верхний слой
содержит кубиков меньше, чем предыдущий. Требуется написать программу,
вычисляющую число лесенок, которое можно построить из N кубиков.
Пример: для 6 кубиков можно сделать: 5-1, 4-2, 3-2-1.
Другие языки программирования и технологии
PHP - Посчитать число лесенок из N кубиков
Нет, не требуется. Во всяком случае, от нас.
Хочешь, чтобы тебе помогли - выкладывай, что сделал (тут проще всего рекурсией, для оптимизации можно кешировать результаты) .
Хочешь, чтобы сделали за тебя - предлагай деньги.
Хочешь, чтобы тебе помогли - выкладывай, что сделал (тут проще всего рекурсией, для оптимизации можно кешировать результаты) .
Хочешь, чтобы сделали за тебя - предлагай деньги.
Как вариант:
$a = 0;
for($i=n;$i>0;$i--)
{
$a=+$i
{
$1=40rub
}
print $a;
$a = 0;
for($i=n;$i>0;$i--)
{
$a=+$i
{
$1=40rub
}
print $a;
Витя Ключнов
$1=40rub - что за строка?
$a = 0;
for($i=n;$i>0;$i--)
{
$a+=$i;
}
print $a;
+++++++++++UPD
Не в том порядке написал
($a=+$i;) => ( $a+=$i;)
for($i=n;$i>0;$i--)
{
$a+=$i;
}
print $a;
+++++++++++UPD
Не в том порядке написал
($a=+$i;) => ( $a+=$i;)
Коллегия Адвокатов
Эта программа треугльные числа считает. А тут другая задача.
Реально на PHP? Это не очень алгоритмический язык, он затачивался под строки, но если очень надо, пишите…
Алгоритм примерно такой (самый простой в объяснении) :
Использовать матрицу A(M, N) - количество лесенок из N кубиков, когда в основании M.
По понятным причинам M < N, то есть матрица треугольная.
Первое значение A(1, 2) = 1.
Далее имея треугольник A(M, N) нужно конструировать A(i, N+1) i=1…N
Тут вложенный цикл, так как нужно перебрать по одному весь второй ряд от j=1…(N+1-i) накапливая количество:
-- если j >= i то пропускаем это j (это не лесенка)
-- иначе проверим, что осталось от k=(N+1-i)-j - это на 3ий и выше этажи
----k=0 - количество = количество + 1 (тут нельзя использовать A - лесенка низковата)
----k>0 - количество = количество + A(j, k+j)
A(i, N+1) = количество
ЗЫ
Допускаю, что где-то обсчитался, решал эту задачу более 10 лет назад.
Причём решал не через матрицу, а рекурсией, просто с матрицей проще отлаживать.
Но всё было как-то так.
ЗЗЫ
Это вообще-то олимпиадная школьная задачка.
Алгоритм примерно такой (самый простой в объяснении) :
Использовать матрицу A(M, N) - количество лесенок из N кубиков, когда в основании M.
По понятным причинам M < N, то есть матрица треугольная.
Первое значение A(1, 2) = 1.
Далее имея треугольник A(M, N) нужно конструировать A(i, N+1) i=1…N
Тут вложенный цикл, так как нужно перебрать по одному весь второй ряд от j=1…(N+1-i) накапливая количество:
-- если j >= i то пропускаем это j (это не лесенка)
-- иначе проверим, что осталось от k=(N+1-i)-j - это на 3ий и выше этажи
----k=0 - количество = количество + 1 (тут нельзя использовать A - лесенка низковата)
----k>0 - количество = количество + A(j, k+j)
A(i, N+1) = количество
ЗЫ
Допускаю, что где-то обсчитался, решал эту задачу более 10 лет назад.
Причём решал не через матрицу, а рекурсией, просто с матрицей проще отлаживать.
Но всё было как-то так.
ЗЗЫ
Это вообще-то олимпиадная школьная задачка.
Витя Ключнов
Ненавижу школьников, больно умные! )))
Насчет PHP, да, только на нем.
Насчет школьной олимпиадной - тоже знаю, даже находил исходные коды на Pascal, просто не получается перевести их в PHP
Насчет PHP, да, только на нем.
Насчет школьной олимпиадной - тоже знаю, даже находил исходные коды на Pascal, просто не получается перевести их в PHP
Похожие вопросы
- как представить число в двоичном n-разрядном представлении
- Задан массив m на n. Числа m и n вводятся вручную. Заполнить массив случайным образом. Найти произведение чисел от 10 до
- [php] Разделение числа из переменной
- Помогите решить на ПАСКАЛЕ!Увеличить четные числа массива размера N,на исходное значение первого четного числа.
- Сколько чисел надо взять в последовательности 1+2+3+4...,чтобы получить число,больше чем N?
- Правильно я сделал выработку неповторяющихся случайных чисел в диапазоне N?С интернета брал подпрограммки.
- Даны натуральные числа N и A1,…, AN. Образовать новые одномерные последовательности B1, …, BN и C1, …, CN
- Вводится число N, а затем N чисел. Подсчитайте, сколько среди данных N чисел нулей.
- Вам даны все целые числа от 1 до N + 1, кроме одного. Найдите отсутствующее число.
- Паскаль. Представить натуральное число n в виде суммы трёх квадратов натуральных чисел.
Пытался переделать код с Pascal на PHP, не работает (кстати, там тоже используется рекурсия).
Т. е. , если n = 6, то нужные следующие суммы:
5 + 1 = 6
4 + 2 = 6
3 + 2 + 1 = 6
Т. е. 3 суммы - 3 варианта лесенок.
Понятно, что первое слагаемое первой суммы должно быть (n-1), первое слагаемое второй суммы - (n-2), третьей суммы - (n-3), пока n не станет "1".
Мне не понятно, как вообще реализовать это, простым if не обойтись, т. к. число слагаемых суммы может быть и "2", и "3".