Сейчас на форуме: UniSoft, laslo, bartolomeo (+5 невидимых) |
eXeL@B —› Программирование —› Разложение числа на слагаемые |
Посл.ответ | Сообщение |
|
Создано: 12 сентября 2011 20:26 · Поправил: Isaev · Личное сообщение · #1 Тривиальная задача, одно из решений в аттаче (с рекурсией) Проблема в том, что оно работает долго! Каким образом: 1. уйти от рекурсии 2. от использования глобальных переменных В идеале разложение вообще не требуется и возможно существует просто формула нахождения кол-ва возможных вариантов, но я её не нашёл. По формулам комбинаторики, возможно можно вычислить достаточно быстро... Этот пример n(100)=190569292 считает у меня 02 min 33 sec 110 msec n(200) страшно запускать 1af8_12.09.2011_EXELAB.rU.tgz - Unit1.pas ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 12 сентября 2011 20:31 · Поправил: Kiev78 · Личное сообщение · #2 |
|
Создано: 12 сентября 2011 20:49 · Личное сообщение · #3 Хоть бы сказал, что нужно. Если количество способов разбить число на слагаемые с учётом порядка, то ответ 2^(n-1) <записываем n единичек, между некоторыми ставим плюсики>. Если без учёта, то тут я умею только предлагать динамику d[n][k] = количество способов представить число n в виде суммы чисел, каждое из которых <= k. тогда d[n][k] = d[n-k][k] + d[n][k-1] (так как мы либо используем хотя бы одно число k в разложении, либо нет) |
|
Создано: 12 сентября 2011 20:53 · Поправил: Isaev · Личное сообщение · #4 |
|
Создано: 12 сентября 2011 21:00 · Поправил: Isaev · Личное сообщение · #5 vptrlx Не то, не то... n(100)=190569292 это я дал для проверки... т.е. программа выше работает правильно, но медленно во-первых из-за рекурсии, во-вторых из-за формирования самих последовательностей, что в общем и не требуется 2^(n-1) - явно не катит vptrlx пишет: d[n][k] = количество способов представить число n в виде суммы чисел, каждое из которых <= k. Я бы сказал нужно: количество способов представить число n в виде суммы чисел, каждое из которых <= n 1+2+3 и 1+3+2 не считаются за разные варианты, т.к. имеют одинаковые слагаемые ps: скомпилил для тех, у кого нет delphi 9453_12.09.2011_EXELAB.rU.tgz - test.exe ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 12 сентября 2011 23:13 · Личное сообщение · #6 Isaev пишет: d[n][k] = количество способов представить число n в виде суммы чисел, каждое из которых <= k. Я бы сказал нужно: количество способов представить число n в виде суммы чисел, каждое из которых <= n1+2+3 и 1+3+2 не считаются за разные варианты, т.к. имеют одинаковые слагаемые ответ d[n][n]. Ваш К.О. ;) |
|
Создано: 13 сентября 2011 01:55 · Личное сообщение · #7 |
|
Создано: 13 сентября 2011 15:47 · Личное сообщение · #8 |
|
Создано: 13 сентября 2011 16:27 · Поправил: negoday · Личное сообщение · #9 Isaev Я очень плохо учился в школе по математике, но попробовав твою тулзу и вбив туда числа от 1 до 10 как-то интуитивно представил себе график функции примерно такой (см. аттач). Точно помню, что такие в школе решали. Причём ещё точнее помню, что график зеркалился в отрицательную сторону осей и было это всё безобразие как-то связано с тангенсами-катангенсами, синусами косинусами что-ли, но тут я увы точно могу ошибиться. Надеюсь мои убогие воспоминания школьных лет натолкнут тебя на верный путь Посмотри прогу под названием Universal mathematic resolver (UMS) - универсальный математический решатель - я как-то своему сыну скачивал - там были эти графики - сейчас тулзы под рукой нет. Добавлено позже: кажется нашёл - это называется степенная функция y=x в степени a. Степень a может варьировать и в зависимости от неё получается разный график. В твоём случае a либо натуральное число либо простая дробь типа 3\4 2\3 и т.п. Вот тут документъ: 63a1_13.09.2011_EXELAB.rU.tgz - n(x).JPG |
|
Создано: 13 сентября 2011 17:04 · Личное сообщение · #10 http://forum.sources.ru/showtopic=49720&st=0 Алгоритм от trainer самый быстрый | Сообщение посчитали полезным: Isaev |
|
Создано: 13 сентября 2011 18:02 · Личное сообщение · #11 |
|
Создано: 13 сентября 2011 21:21 · Поправил: depler · Личное сообщение · #12 |
|
Создано: 13 сентября 2011 21:39 · Личное сообщение · #13 |
|
Создано: 13 сентября 2011 22:42 · Личное сообщение · #14 хакеры, блин. 0 секунд: Code:
| Сообщение посчитали полезным: Isaev, uinor |
|
Создано: 14 сентября 2011 01:53 · Поправил: Isaev · Личное сообщение · #15 |
|
Создано: 14 сентября 2011 08:50 · Личное сообщение · #16 |
|
Создано: 14 сентября 2011 17:40 · Личное сообщение · #17 |
|
Создано: 14 сентября 2011 21:18 · Личное сообщение · #18 |
|
Создано: 14 сентября 2011 21:40 · Личное сообщение · #19 ну от 127, положим, ещё не переполняется, вроде бы, но не суть. а так, ну найди себе своп на несколько гигабайт, если очень надо. если очень хочется, чтобы работало и там, где нету нескольких гигабайт, то предподсчитай и забей константы. Благо для всех k <= n d[k][k] = ответ для k. более оптимального решения afair нету. эта динамика по памяти ну никак не оптимайзится |
eXeL@B —› Программирование —› Разложение числа на слагаемые |