Сочетаниями из n элементов по k называются соединения, которые можно образовать из n элементов, собирая в каждое соединение k элементов; при этом соединения отличаются друг от друга только самими элементами (различие порядка их расположения во внимание не принимается).
Например, из 3 элементов (a,b,c) по 2 можно образовать следующие сочетания: ab, ac, bc.
Число всех возможных сочетаний, которые можно образовать из n элементов по k, обозначается символом Cnk и вычисляется по формуле:
За основу математических алгоритмов был взяты статьи с http://algolist.manual.ru/maths/combinat/
Так же хочется поблагодарить пользователя noblekey за его алгоритм генерации случайных чисел. Код был взят с публикации //infostart.ru/public/57305/
Алгоритм генерации сочетаний обширно использовался мною на олимпиадах по 1С.
Возможно, есть более быстрые решения. Обработка поддерживает максимально число из 20 цифр, но можно добавить в табличную часть «Числа» реквизиты вида «Цифра_21″,»Цифра_22» и больше, и после чего будет поддерживаться числа, длиной больше 20 цифр.
По необходимости могу выложить работу на управляемых формах
а есть что нибудь для необычных приложений?
(2) WKBAPKA, есть «что нибудь» для управляемого приложения)
Долго переделывали алгоритм?
(4) mikuho, алгоритм переделывал с паскаля. но собирал его из двух исходников. в целом, ушло около 6 часов на написание(pascal) и перенос на 1С. Много возникало нюансов по поводу генерации случайных чисел. Не обошлось без помощи коллег)
Алгоритм?
В самом простом для понимания виде:
Показать
Вот из жизни: подходишь к двери, на ней кодовый замок (нужно нажать три кнопки из десяти и дверка откроется, визуально код определить не возможно — на кнопках нет потёртостей). Нужно перебрать все возможные варианты.
Алгоритм перебора:
1. Зажимаешь пальцами одной руки 1 и 2, перебираешь свободной клавиши 3,4,5,6,7,8,9,0,
2. Далее зажимаешь 1 и 3, перебираешь 4,5,6,7,8,9,0 (2 не надо, т.к. 123 равнозначно 132)
… и так до 1 и 8, нажимаешь 9.
3. Зажимаешь 2 и 3, перебираешь 4,5,6,7,8,9,0 (1 не надо, т.к. с ним уже все комбинации перебрали)
4. Зажимаешь 2 и 4, перебираешь 5,6,7,8,9,0
и так до 8-9-0
или тоже самое в коде:
Для общего случая, когда N и k заранее неизвестны — подойдет использование рекурсии.
(6) DrAku1a, Согласен, есть простое понимание. А есть универсальное, в котором не нужно учитывать количество циклом и писать 20 «Для Каждого Цикл». Главное свойство любого алгоритма — оптимальность и универсальность.
не совсем понимаю зачем это, но плюс
(8) anig99, В прикладных задачах найти применение трудно. Я писал конфигурацию по Лото(сбор, анализ данных, планирование ставок и тому подобное) Если интересно — могу выложить на всеобщее обозрение. Вот как раз там я использовал данный алгоритм
(9) а что за конфигурация, можно по подробней? я кажется пишу нечто подобное
(10) mikuho, анализ данных лото. делал летом этого года, около 5-6 месяцев)
Могу выложить на всеобщее обозрение