Я ведь знаю тут собрана самая мозговитая прослойка двача, но вдруг. Мне нужна помощь в решении следующего алгоритма.Задачка не из легких. Уже два дня потею, вот вот вроде выведу норм алгоритм,но нифига. Я уже и рекурсией, и мат. формулы искал. Ближе к делу. Необходимо подсчитать число разбиений (N) на слагаемые, для вводимого нами числа (Sum), при том, что у нас есть список доступных слагаемых (Arr).Пример: мы вводим число 7, и задаем слагаемые - [1,2,5]. Из этих условий следует, что Sum = 7; Arr = [1,2,5], а количество разбиений N нам нужно вычислить:1) {5,2};2) {5,1,1};3) {2,2,2,1};4) {2,2,1,1,1};5) {2,1,1,1,1,1};6) {1,1,1,1,1,1,1};В нашем случае N = 6;Важный момент - слагаемые могут повторяться, но их последовательность не важна, то есть разбиения типа {5,2} и {2,5} тождественны между собой и должны учитываться как одно решение Ребят, помогите плз. Упарывание всяких там формул Эйлера и т.д. не помогло в силу отсутствия решения для конкретно подобного случая
бамп
бампчинский
Еще пару раз бамп
>>132842611 (OP)Ну дык перебирай. Берем ноль первых слагаемых, ноль вторых, ноль третьих. Сложили. Результат равен Сум? Нет. Значит берем одно первое, ноль вторых, ноль третьих. Снова складываем. И так далее.S = N1a + N2b + N3cПока N1a не станет больше Сум.
>>132842611 (OP)>Arr = [1,2,5]>1) {5,2};Ты ебанат, сцуко? Куда единицу дел, блжад? У тебя из-за неё не хватает одного шага разбиения.
>>132843159Нам не обязательно использовать все слагаемые.
>>132843051Главное не перепутать, где поставить условие сравнения суммы, иначе он будет выводить результат, не проведя лишний раз цикл.
>>132843051Это понятно, но суть в том, что длинна массива может быть динамической понимаешь? Нужно реализовать как-то рекурсию либо же цикл исчерпывающий. Например: число может быть 1523, а массив - [1,2,5,10,25,50].
>>132843367Дык заведи массив коэффициентов длиной равной количеству слагаемых. {N1;N2;N3...}И каждый раз увеличивай один из членов на единичку. Потом считай сумму. S = N1a + N2b + N3c
BUMBPB
го решим супер задачу всем двачем.
ща решу, оп, ради тебя.
>Задачка не из легких. Уже два дня потеюТы идиот? Ты идиот!1) Делаешь n вложенных цикла. где n - кол-во предполагаемых слогаемых, читай длинна Arr.2) В теле последнего цикла складываешь все итераторы, умноженные на соответственные слогаемые. 2.1) Если сумма равна указанному числу, то записываешь её куда-нибудь или распечатываешь.2.2) Если сумма меньше указанной, то continue.2.3) Если сумма больше, то выходишь из этого тела и делаешь такую же проверку в теле предыдущего цикла. 3) И так далее.Чтобы лишних проходов не было, нужно будет там еще пару флагов создать и проверять их. Но это уже так, детали реализации. Можешь делать как хочешь.
Какие ограничения на входные данные?
>>132843051Твой алгоритм в лоб медленнее, чем мозг твоей мамаши. Уже для 1000 потратишь миллион лет на подсчет.Решал эту задачу в будучи пиздюком, несложное решение кстати. А сейчас для таких ленивых школяров даже вики есть.https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%B0
>>132843764Забыл сказать, что отсортировать нужно сначала массив будет, чтобы от малых, к большим числа располагались.Иначе некоторые случаи проебутся.
>>132843764Еще один гений блядь. Оцени сперва сложность своего алгоритма.
>>132843957Нихуя себе ты умный школяр. Ну го пробнем. Только еще раз уточну у нас - СОЗДАВАЕМОЕ НАМИ МНОЖЕСТВО СЛАГАЕМЫХ, а не просто слагаемые любого рода или соответствующие какой-то формул (как у Эйлера к примеру).
>>132843957Чувствуешь разницу между числом разбиений и самими разбиениями?И там слагаемые указанные, а не просто натуральные числа.
>>132843957Я знаю о нем. Думаю, опчику наглядно нужно показывать. Затем и программа пишется.
>>132844168Наглядно нужно, и еще скажу, что прежде чем сюда зайти, я гугли 2 дня и перечитал первых 3-4 страницы. + коротенькую книжечку про вычисления Эйлера и построение диаграмы Юнга .И хочу сказать, что решение - нихуя не простой алгоритм.
>>132844087Я к несчастью уже не школяр.Твой список доступных слагаемых лишь незначительно усложнит алгоритм - подход останется тот же, что и описанный в вики - реккуретный расчет через уже посчитанные случаи.
>>132844138Ты статью-то глянь, жопочтец. Там именно число разбиений и расчитывается, что и нужно ОП-хую.
>>132844018Сложность O(n^3). Там по-другому не сделать.Можно с самого начала поделить число на самое последнее слагаемое(самое большое), потом умножить это число на само слагаемое.Но это просто немного ускорит нахождение первого числа, похуй на это.
>>132843734[code]var sum = 7;var arr = [1,2,5];var results = []arr = arr.sort().reverse();var sum_array = function(array) { return array.reduce(function(pv, cv) { return pv + cv; }, 0);};var rec = function(index, presult) { if (sum_array(presult) == sum) { results.push(presult); } else { if (sum_array(presult) < sum) { for (var i = index; i < arr.length; i = i + 1) { var ppresult = presult.slice(); ppresult.push(arr[index]); rec(i, ppresult); } } }};for (var i = 0; i < arr.length; i = i + 1) { rec(i, [])};console.log(results.length);[/code]Нужно еще выбросить из arr одинаковые элементы.
>>132844470Блять, я думал опу нужно сами разбиения. Ну тогда пусть идёт нахуй, это совсем изи.
>>132844572Можно и сами разбиения.
>>132844328Решение охуенно простое, ежели в лоб. Выше объяснил. Заводи массив коэффициентов. Перебирай значение каждого от 0 до максимального (это когда произведение N на соответствующее слагаемое станет больше суммы). Отбирай годный сочетания коэффициентов. И все.
>>132844506>Сложность O(n^3)Ну ты рассмешил, содомит.
Сложность-хуежность.Главное сделай, потом допилишь.Лучше наличие плохой программы, чем полное ее отсутствие.
>>132844551хуя прям на JS ебнул?
>>132844629Если сами разбиения, то быстрее вот этого скорее всего не выйдет.>>132843764>>132843976
>>132844506Нет. Так как слагаемые могут быть рода 1, 13, 5 и т.д. То есть не кратные друг другу - > различные решения для разных слагаемых
>>132844350В общем для случая Sum = 6 пусть пишет в лоб и неебет. Вот если бы хотя бы Sum=100 было бы в задаче, то его можно было бы обоссать в его решением в лоб.
>>132844551Вот пастебин, а то я не ебу как в макабе разметку делать: http://pastebin.com/Z0vid4cP>>132844705Хули бы и нет?
>>132844670Не третий в смысле, а arr.size().
>>132844803Ты о чём вообще? Я написал о том, что можно на самом первом шаге получить с помощью деления/умножения уже большое число и приблизиться к первому.А то так получится, что если число большое, а слагаемые маленькие все, то это первое число будет набираться долго.
>>132844820Да мне просто на JS и нужно было.. Думал щас тут крестовые или жабовые боги начнут анус дергать. А я пока синтаксис их вспомню.
>>132844812Чувак решение пишиться как раз таки для чисел 100>>> (примерно 1000-3000)
>>132842611 (OP)ебать ты хуйесос это же обычная задача на сдачуdp=количество разбиений числа i с заданными слагаемыми делаем так ю литл пусси, a=массив слагаемыхdp[0]=1;for i=1 to Sum--dp=0;--for j=1 to n-----if(i-a[j]>=0) dp+=dp[i-j];output(dp[n]);сложность O(nSum);мимо олимпиадникps если не понял почитай про динамику и задачу о рюкзаке, сдачу
>>132845136А, ну тогда ясно дело, что рекурретно считать надо.
>>132845187много денег зарабатываеж?
>>132845187Блляяя я начал вьезжать. сука у меня не хватало момента вот этого dp[i-j]; не вьезжал как выразить коефициенты.
>>132845308Уборщик в маке, обещают повысить до старшего.
>>1328451872,6,7 строка dp, а не просто dp ;опечатка
>>132845410фух, славо богуа то я не понял нихуя и думаю, вот ведь блятьа так я получаю больше 2к зелени и работаю меньше 20 часов в неделю без походов в офисне зря школу бросил
>>132845308100 раза больше чем ты, жаль, что это все ровно 0Pepe
>>132844551Вроде пашет, но как-то не понятно
>>132842611 (OP)визуально я вижу так, но, как мне кажется тебе тебе нужно обратиться в раздел высшей математики, где рассказвают о сочетании с повторениями.
SDF
>>132845528Это ЧТО ?! Китаййская книга перемен на значке Покемон ГО?
>>132845187Спасибо, ща по JS подомнуть попробую.
>>132845625визуальное представление алгоритма
>>132845673>>132845528Что это за НЕХ?
>>132845528Нормально, что я ржу ?
>>132845816даОппосмотри тут матчастьhttp://hijos.ru/izuchenie-matematiki/algebra-10-klass/19-razmeshheniya-perestanovki-sochetaniya-s-povtoreniyami-formula-vklyucheniya-isklyucheniya/
>>132844551Не катит если задавать число 2, а массив [1,2]
>>132845528какой нахуй выш мат, это просто обычная задача на динамику >>132845187
>>132846284ну я не ищу легких путей
var i,n,m : longint; a : array [1..100] of longint; Function Find (N,M:longint):longint; begin if (N=0) and (m=0) then begin Find:=1; exit; end; if (N=0) and (m<>0) then begin Find:=0; exit; end; if ((m-a[n])>=0) then Find:=Find(n-1,m)+Find(n-1,m-a[n]) else Find:=Find(n-1,m) end;begin read(m,n); for i:=1 to n do read (a); writeln (Find(N,M));end.
>>132842611 (OP)паста с програмача, расходимся
>>132845508>>132846009Исправил: http://pastebin.com/kqxjth9LА вообще у этого быстрее решение: >>132846649