Нахождение лексикографически чисел с определенной суммой - PullRequest
0 голосов
/ 22 декабря 2018

Я изо всех сил пытаюсь найти решение для следующей проблемы.

Представьте, что у меня есть 6 конфет, и я должен дать этим конфетам 6 детей, где ни у одного из них не может быть больше 2 конфет.

Пример: 000222 121020

Что мне нужно сделать, так это найти все возможные решения в лексикографическом порядке, поэтому для того же примера, что и выше, он будет выглядеть следующим образом.

000222 001122001212 001221

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

Моя проблема в том, что мой алгоритм не работает должным образом, так, как я написал, когда ему нужно что-то вроде этого:

console.log(nextSchedule("001221"))

Это даст мне 002121, когда правильный ответ будет 002022. ЯЯ понимаю, почему мой алгоритм делает это, но я не знаю, как его улучшить, чтобы он мог справиться с этими случаями.

Я отправляю свой алгоритм nextSchedule таким, какой он есть сейчас.

Может кто-тодайте мне какое-то направление, чтобы заставить его работать?

Заранее спасибо!

function nextSchedule(currentSchedule) {
    let newSchedule = currentSchedule.split('');
    for (let i = newSchedule.length - 1; i > 0; i--) {
        if (newSchedule[i] > newSchedule[i - 1]) {
            newSchedule[i]--;
            newSchedule[i - 1]++;
            break;
        }
    }
    newSchedule = newSchedule.join('');
    return newSchedule === currentSchedule ? null : newSchedule;
}

1 Ответ

0 голосов
/ 22 декабря 2018

Предложение: представьте, что ваша цель состояла в том, чтобы получить все возможные числа от 000000 до 222222, где каждая цифра может варьироваться только от 0 до 2. Ваш метод будет делать это, беря входной номер, затем добавляя 1 к крайней правой цифре.Если результат больше 2, оберните его в 0 и перенесите цифру 1 сразу влево.Повторяйте до тех пор, пока не прекратится перенос.

(Это все равно, что добавить на бумаге два числа, за исключением того, что вы остановитесь на 2 вместо 9).

Однако теперь у вас естьдополнительное ограничение: вам нужны цифры только в том случае, если всего выдано шесть конфет (т.е. сумма всех цифр в номере равна 6).Итак, добавьте эту регистрацию - если «следующий» номер не добавляет 6, то просто продолжайте повторять процесс, пока не найдете тот, который делает.

По сути, вы будете циклически проходить все 729 6-значите цифры-3, но отбросьте те, которые не соответствуют вашим критериям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...