[Ответить в тред] Ответить в тред

09/07/16 - Новое API для капчи - внимание разработчикам приложений
03/04/16 - Набор в модераторы 03.04 по 8.04
26/03/16 - Конкурс: Помоги гомункулу обрести семью!


[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 62 | 3 | 14
Назад Вниз Каталог Обновить

Аноним 28/07/16 Чтв 20:24:54  132842611  
14697266943170.jpg (34Кб, 604x403)
Я ведь знаю тут собрана самая мозговитая прослойка двача, но вдруг. Мне нужна помощь в решении следующего алгоритма.
Задачка не из легких. Уже два дня потею, вот вот вроде выведу норм алгоритм,но нифига. Я уже и рекурсией, и мат. формулы искал.
Ближе к делу.

Необходимо подсчитать число разбиений (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} тождественны между собой и должны учитываться как одно решение

Ребят, помогите плз. Упарывание всяких там формул Эйлера и т.д. не помогло в силу отсутствия решения для конкретно подобного случая
Аноним 28/07/16 Чтв 20:26:18  132842710
бамп
Аноним 28/07/16 Чтв 20:26:38  132842737
бампчинский
Аноним 28/07/16 Чтв 20:28:32  132842864
Еще пару раз бамп
Аноним 28/07/16 Чтв 20:30:57  132843051
>>132842611 (OP)
Ну дык перебирай. Берем ноль первых слагаемых, ноль вторых, ноль третьих. Сложили. Результат равен Сум? Нет. Значит берем одно первое, ноль вторых, ноль третьих. Снова складываем. И так далее.
S = N1a + N2b + N3c
Пока N1
a не станет больше Сум.
Аноним 28/07/16 Чтв 20:32:24  132843159
>>132842611 (OP)
>Arr = [1,2,5]
>1) {5,2};
Ты ебанат, сцуко? Куда единицу дел, блжад? У тебя из-за неё не хватает одного шага разбиения.
Аноним 28/07/16 Чтв 20:33:15  132843223
>>132843159
Нам не обязательно использовать все слагаемые.
Аноним 28/07/16 Чтв 20:34:21  132843310
>>132843051
Главное не перепутать, где поставить условие сравнения суммы, иначе он будет выводить результат, не проведя лишний раз цикл.
Аноним 28/07/16 Чтв 20:35:07  132843367
>>132843051
Это понятно, но суть в том, что длинна массива может быть динамической понимаешь? Нужно реализовать как-то рекурсию либо же цикл исчерпывающий.

Например: число может быть 1523, а массив - [1,2,5,10,25,50].
Аноним 28/07/16 Чтв 20:38:09  132843611
>>132843367
Дык заведи массив коэффициентов длиной равной количеству слагаемых. {N1;N2;N3...}
И каждый раз увеличивай один из членов на единичку. Потом считай сумму. S = N1a + N2b + N3c
Аноним 28/07/16 Чтв 20:38:21  132843623
BUMBPB
Аноним 28/07/16 Чтв 20:39:35  132843716
го решим супер задачу всем двачем.
Аноним 28/07/16 Чтв 20:39:51  132843734
ща решу, оп, ради тебя.
Аноним 28/07/16 Чтв 20:40:14  132843764
>Задачка не из легких. Уже два дня потею
Ты идиот? Ты идиот!
1) Делаешь n вложенных цикла. где n - кол-во предполагаемых слогаемых, читай длинна Arr.
2) В теле последнего цикла складываешь все итераторы, умноженные на соответственные слогаемые.
2.1) Если сумма равна указанному числу, то записываешь её куда-нибудь или распечатываешь.
2.2) Если сумма меньше указанной, то continue.
2.3) Если сумма больше, то выходишь из этого тела и делаешь такую же проверку в теле предыдущего цикла.
3) И так далее.

Чтобы лишних проходов не было, нужно будет там еще пару флагов создать и проверять их. Но это уже так, детали реализации. Можешь делать как хочешь.
Аноним 28/07/16 Чтв 20:41:24  132843870
Какие ограничения на входные данные?
Аноним 28/07/16 Чтв 20:42:17  132843957
>>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
Аноним 28/07/16 Чтв 20:42:29  132843976
>>132843764
Забыл сказать, что отсортировать нужно сначала массив будет, чтобы от малых, к большим числа располагались.
Иначе некоторые случаи проебутся.
Аноним 28/07/16 Чтв 20:43:01  132844018
>>132843764
Еще один гений блядь. Оцени сперва сложность своего алгоритма.
Аноним 28/07/16 Чтв 20:43:51  132844087
>>132843957
Нихуя себе ты умный школяр. Ну го пробнем. Только еще раз уточну у нас - СОЗДАВАЕМОЕ НАМИ МНОЖЕСТВО СЛАГАЕМЫХ, а не просто слагаемые любого рода или соответствующие какой-то формул (как у Эйлера к примеру).
Аноним 28/07/16 Чтв 20:44:35  132844138
>>132843957
Чувствуешь разницу между числом разбиений и самими разбиениями?
И там слагаемые указанные, а не просто натуральные числа.
Аноним 28/07/16 Чтв 20:45:01  132844168
>>132843957
Я знаю о нем. Думаю, опчику наглядно нужно показывать. Затем и программа пишется.
Аноним 28/07/16 Чтв 20:47:13  132844328
>>132844168
Наглядно нужно, и еще скажу, что прежде чем сюда зайти, я гугли 2 дня и перечитал первых 3-4 страницы. + коротенькую книжечку про вычисления Эйлера и построение диаграмы Юнга .
И хочу сказать, что решение - нихуя не простой алгоритм.
Аноним 28/07/16 Чтв 20:47:24  132844350
>>132844087
Я к несчастью уже не школяр.

Твой список доступных слагаемых лишь незначительно усложнит алгоритм - подход останется тот же, что и описанный в вики - реккуретный расчет через уже посчитанные случаи.
Аноним 28/07/16 Чтв 20:48:38  132844470
>>132844138

Ты статью-то глянь, жопочтец. Там именно число разбиений и расчитывается, что и нужно ОП-хую.
Аноним 28/07/16 Чтв 20:49:08  132844506
>>132844018
Сложность O(n^3). Там по-другому не сделать.
Можно с самого начала поделить число на самое последнее слагаемое(самое большое), потом умножить это число на само слагаемое.
Но это просто немного ускорит нахождение первого числа, похуй на это.
Аноним 28/07/16 Чтв 20:49:37  132844551
>>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 одинаковые элементы.
Аноним 28/07/16 Чтв 20:49:51  132844572
>>132844470
Блять, я думал опу нужно сами разбиения. Ну тогда пусть идёт нахуй, это совсем изи.
Аноним 28/07/16 Чтв 20:50:31  132844629
>>132844572
Можно и сами разбиения.
Аноним 28/07/16 Чтв 20:50:59  132844668
>>132844328
Решение охуенно простое, ежели в лоб. Выше объяснил. Заводи массив коэффициентов. Перебирай значение каждого от 0 до максимального (это когда произведение N на соответствующее слагаемое станет больше суммы). Отбирай годный сочетания коэффициентов. И все.
Аноним 28/07/16 Чтв 20:51:00  132844670
>>132844506
>Сложность O(n^3)
Ну ты рассмешил, содомит.
Аноним 28/07/16 Чтв 20:51:23  132844702
Сложность-хуежность.
Главное сделай, потом допилишь.
Лучше наличие плохой программы, чем полное ее отсутствие.
Аноним 28/07/16 Чтв 20:51:31  132844705
>>132844551
хуя прям на JS ебнул?
Аноним 28/07/16 Чтв 20:51:35  132844711
>>132844629
Если сами разбиения, то быстрее вот этого скорее всего не выйдет.
>>132843764
>>132843976
Аноним 28/07/16 Чтв 20:52:44  132844803
>>132844506
Нет. Так как слагаемые могут быть рода 1, 13, 5 и т.д. То есть не кратные друг другу - > различные решения для разных слагаемых
Аноним 28/07/16 Чтв 20:52:53  132844812
>>132844350
В общем для случая Sum = 6 пусть пишет в лоб и неебет. Вот если бы хотя бы Sum=100 было бы в задаче, то его можно было бы обоссать в его решением в лоб.
Аноним 28/07/16 Чтв 20:53:02  132844820
>>132844551
Вот пастебин, а то я не ебу как в макабе разметку делать: http://pastebin.com/Z0vid4cP
>>132844705
Хули бы и нет?
Аноним 28/07/16 Чтв 20:53:06  132844827
>>132844670
Не третий в смысле, а arr.size().
Аноним 28/07/16 Чтв 20:55:30  132845038
>>132844803
Ты о чём вообще? Я написал о том, что можно на самом первом шаге получить с помощью деления/умножения уже большое число и приблизиться к первому.
А то так получится, что если число большое, а слагаемые маленькие все, то это первое число будет набираться долго.
Аноним 28/07/16 Чтв 20:55:30  132845039
>>132844820
Да мне просто на JS и нужно было.. Думал щас тут крестовые или жабовые боги начнут анус дергать. А я пока синтаксис их вспомню.
Аноним 28/07/16 Чтв 20:56:44  132845136
>>132844812
Чувак решение пишиться как раз таки для чисел 100>>> (примерно 1000-3000)
Аноним 28/07/16 Чтв 20:57:21  132845187
>>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 если не понял почитай про динамику и задачу о рюкзаке, сдачу
Аноним 28/07/16 Чтв 20:57:55  132845228
>>132845136
А, ну тогда ясно дело, что рекурретно считать надо.
Аноним 28/07/16 Чтв 20:59:00  132845308
>>132845187
много денег зарабатываеж?
Аноним 28/07/16 Чтв 20:59:21  132845339
>>132845187
Блляяя я начал вьезжать. сука у меня не хватало момента вот этого dp[i-j]; не вьезжал как выразить коефициенты.
Аноним 28/07/16 Чтв 21:00:24  132845410
>>132845308
Уборщик в маке, обещают повысить до старшего.
Аноним 28/07/16 Чтв 21:00:31  132845419
>>132845187
2,6,7 строка dp, а не просто dp ;
опечатка
Аноним 28/07/16 Чтв 21:01:13  132845470
>>132845410
фух, славо богу
а то я не понял нихуя и думаю, вот ведь блять
а так я получаю больше 2к зелени и работаю меньше 20 часов в неделю без походов в офис
не зря школу бросил
Аноним 28/07/16 Чтв 21:01:36  132845502
>>132845308
100 раза больше чем ты, жаль, что это все ровно 0
Pepe
Аноним 28/07/16 Чтв 21:01:41  132845508
14697289013730.png (20Кб, 220x545)
>>132844551
Вроде пашет, но как-то не понятно
Аноним 28/07/16 Чтв 21:01:58  132845528
14697289181970.png (11Кб, 400x400)
>>132842611 (OP)
визуально я вижу так, но, как мне кажется тебе тебе нужно обратиться в раздел высшей математики, где рассказвают о сочетании с повторениями.
Аноним 28/07/16 Чтв 21:02:40  132845586
SDF
Аноним 28/07/16 Чтв 21:03:16  132845625
>>132845528
Это ЧТО ?!
Китаййская книга перемен на значке Покемон ГО?
Аноним 28/07/16 Чтв 21:03:49  132845667
>>132845187
Спасибо, ща по JS подомнуть попробую.
Аноним 28/07/16 Чтв 21:03:50  132845673
>>132845625
визуальное представление алгоритма
Аноним 28/07/16 Чтв 21:05:41  132845785
>>132845673
>>132845528
Что это за НЕХ?
Аноним 28/07/16 Чтв 21:06:11  132845816
>>132845528
Нормально, что я ржу ?
Аноним 28/07/16 Чтв 21:08:53  132845986
>>132845816
да
Оп
посмотри тут матчасть
http://hijos.ru/izuchenie-matematiki/algebra-10-klass/19-razmeshheniya-perestanovki-sochetaniya-s-povtoreniyami-formula-vklyucheniya-isklyucheniya/
Аноним 28/07/16 Чтв 21:09:16  132846009
>>132844551
Не катит если задавать число 2, а массив [1,2]
Аноним 28/07/16 Чтв 21:12:49  132846284
>>132845528
какой нахуй выш мат, это просто обычная задача на динамику >>132845187
Аноним 28/07/16 Чтв 21:16:59  132846567
>>132846284
ну я не ищу легких путей
Аноним 28/07/16 Чтв 21:18:23  132846649

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.
Аноним 28/07/16 Чтв 21:19:43  132846727
>>132842611 (OP)
паста с програмача, расходимся
Аноним 28/07/16 Чтв 21:38:13  132847881
>>132845508
>>132846009
Исправил: http://pastebin.com/kqxjth9L
А вообще у этого быстрее решение: >>132846649

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 62 | 3 | 14
Назад Вверх Каталог Обновить

Топ тредов