• Как найти все комбинации определенных слагаемых числа?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    1. С самого минимального из заданных (1) - находим целевое (48=1+1+...+1).
    2. Убираем первые слагаемые (12*1) и переходим к следующему ПО ПОРЯДКУ! (12), добавляя его в конец, убрав все лишние (1) вначале. Снова находим целевое (48=1+...+1+12, 48=1+1+..+12+12, ...)
    3. И т.д. мы делаем по всем заданным числам, постепенно заменяя слагаемые В ПОРЯДКЕ ИХ СЛЕДОВАНИЯ и НЕ ПРОПУСКАЯ ("цепочка" не должна нарушаться)! (48=1+...+1+12+24)

    Перебор перестановок здесь - не нужен, т.к. порядок следования слагаемых - строго фиксирован.
    Ответ написан
    Комментировать
  • Как найти все комбинации определенных слагаемых числа?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Различных комбинаций очень много. Так что, раз уж вы их все обходите, то полный перебор будет работать не сильно медленнее. Его потом можно соптимизировать.

    Пишите рекурсивную функцию, которая получает на вход 2 параметра: сколько осталось добрать, какое максимальное слагаемое можно использовать. Текущие слагаемые или идут третьим параметром или вообще хранятся в глобальной переменной.

    Функция перебирает 2 варианта. Пусть отсавшаяся сумма s, а разрешенное максимальное число имеет номер i (они хранятся в каком-нибуть отсортированном a[]).

    1) Берем текущее максимальное слагаемое. Естественно, если оно помещается в остаток s >= a[i]. Кладем его к текущим слагаемым в массив и рекурсивно вызываемся от уменьшенного остатка, не меняя максимальное число - (s-a[i], i). Важно - если слагаемые хранятся в глобальной переменной, то надо после рекурсивного вызова "вернуть как было" - удалить только что добавленное слагаемое из массива.

    2) Пропускаем текущее максимальное число. Значит, больше его брать вообще нельзя. Вызываемся от (s, i-1). Естественно, этот вариант есть только если i>0.

    Если мы получили, что оставшаяся сумма s равна нулю, то мы подобрали разбиение, надо вывести текущие слагаемые.

    Ах да, чтобы этот метод хорошо работал имеет смысл слагаемые отсортировать по возрастанию. Чтобы сначала брались самые большие.

    Если среди возможных слагаемых нет 1, то этот полный перебор может заходить в тупики. На пример, доступны слагаемые 6 и 11, надо набрать 29. Алгоритм может пропустить 11 и попытаться набрать 29 одними шестерками, но этого никогда не получится. Эти лишние тупиковые ветки можно обрезать и ускорить таким образом решение в некоторых случаях.

    Для этого смотрите задачу о рюкзаке. Почти как в ней сделаейте динамическое программирование, которое будет считать, сколько способов собрать заданную сумму k мешьшими слагаемыми. После этого в рекурсивной функции вы можете сразу же возвращаться, если ДП говорит, что вариантов набрать s первыми i слагаемыми - 0.

    Кроме того, если вам нужно только количество вариантов, а не сами разбиения на слагаемые, то вам не нужен перебор, а нужно лишь динамическое программирование.

    EDIT: Только заметил, что вам порядок важен и 1,2,3 считается отдельно от 3,1,2

    Изменения просты - рекурсивная функция теперь принимает только один параметр - сколько осталость добрать. Вместо двух вариантов она перебирает N вариантов - какое именно число из разрешенных взять.

    Оптимизация такая же. реализуете ДП, которое считает, сколько способов собрать заданное число и, если способов нет, возвращаемся из функции.
    Ответ написан
    Комментировать
  • Почему User (sf3) всегда возвращает лишь одну роль?

    Minifets
    @Minifets
    Hello world!!!
    На вскидку могу предположить, что проблема в сущности Role, у тебя в $user стоит аннотация Id. Это значит, что у тебя для каждой записи должен быть уникальный user_id. Так что даже не могу предположить, как ты 2 роли для 1 пользователя умудрился назначить, если тебе это база не должна повалять.
    Ответ написан
    1 комментарий
  • Как выравнять модальное окно вертикально по центру?

    @mr_ko
    Javascript, Node.js. React.js, Vue.js, Wordpress
    Вот такие CSS стили выровняют ровно по центру. Причем ширина и высота не важны (ели они канечно не больше экрана)
    .modal {
        position: absolute;
        left: 50%;
        top: 50%;
        transform: translate(-50%,-50%);
    }
    Ответ написан
    1 комментарий
  • Что я не понимаю в замыканиях?

    mbeloshitsky
    @mbeloshitsky
    Вебдев, систем оперейшонс, ж.д. автоматика
    Ну, до меня уже все написали, но попробую по-другому, вдруг так понятно будет.

    Суть замыканий в том, что вокруг функции замыкается ее контекст - окружение, в котором она была написана (именно написана, а не вызвана, поэтому еще иногда замыкания называют подробнее - замыкания лексического контекста). Это означает, что она всегда "видит" переменные, имеющиеся в этом контексте, даже если вызывается в совершенно других местах, где этими переменными и не пахнет.

    В данном примере у вас

    function(x)

    замкнута в контексте функции

    inBetween(a, b)

    и поэтому будет всегда видеть переменные a и b.

    --


    И выходит, что переменная val является параметром function(x)

    Это уже не про замыкания, это больше про функции высшего порядка.
    Ответ написан
    Комментировать
  • Почему массив, сформированный на php, не определяется как массив в js?

    В js ассоциативных массивов нет, ассоциативные массивы сериализуются в объекты.
    Ответ написан
    Комментировать
  • Почему массив, сформированный на php, не определяется как массив в js?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    ведь и то и другое - массив?
    В php - да. А в javascript - это разные типы данных. У массива в js могут быть только числовые ключи и только по порядку, иначе этот json распарсится как объект.
    Ответ написан
    Комментировать
  • Почему не работает сравнение элементов массивов?

    @Aves
    Когда проверяется последняя буква — 'o', x становится true, ведь такая буква в 'hello' есть. Минимальное исправление сделать так:
    for(var i = 0; i < arr1.length; i++){	
      if(arr.indexOf(arr1[i]) === -1){
         return false;
      }
    }
    return true;

    А вообще можно покрасивее сделать:
    function mutation(arr) {
        return Array.prototype.every.call(arr[1], (e) => ~arr[0].indexOf(e));
    }
    Ответ написан
    3 комментария
  • С чего начать изучение JavaScript?

    @Anatoly_Rodin
    Frontend-developer at online-express.ru
    Привет!
    Я сейчас изучаю JS по этим ресурсам:
    1. codecademy
    2. learn.javascript.ru
    3. Дэвид Флэнаган - JavaScript. Подробное руководство.

    Для начала подойдет.
    Удачи)
    Ответ написан
    1 комментарий
  • Asterisk 1.6 + как реализовать перевод звонка из браузера?

    @spisarenko
    Перфекционист-прокрастинатор
    Смотрите в сторону AMI.
    Если присутствует php, то подробнее можно так:
    https://www.google.ru/search?q=AMI%20%2B%20php&rct=j
    Ответ написан
    3 комментария