Комбинаторика. Формирование комбинаторных групп из N по К
Выборку по К элементов из множества А можно производить, руководствуясь правилами: считать разными выборки, в которых один и тот же элемент занимает разные позиции (либо не считать), допускать повторение одного и того же элемента в выбираемой группе (либо не допускать) и др. В зависимости от наложения определенных ограничений (правил) при выборе элементов разделяют три типа формирования комбинаторных групп. Рассмотрим их на примере:
Пусть N=4, K=2. Элементы исходного множества будем хранить в массиве А (рис.11.1):
Тогда группы по 2 элемента, выбираемые из множества А можно сформировать так, как показано в таблице 11.1:
Размещения | Сочетания | ||
---|---|---|---|
С повторениями | Без повторений | С повторениями | Без повторений |
00 | 01 | 00 | 01 |
01 | 02 | 01 | 02 |
02 | 03 | 02 | 03 |
03 | 10 | 03 | 12 |
10 | 12 | 11 | 13 |
11 | 13 | 12 | 23 |
12 | 20 | 13 | |
13 | 21 | 22 | |
20 | 23 | 23 | |
21 | 30 | 33 | |
22 | 31 | ||
23 | 32 | ||
30 | |||
31 | |||
32 | |||
33 | |||
Группы {01} и {10} считаются различными | Исключаются группы, в кот. один и тот же элемент стоит в разных позициях | Группы {01} и {10} считаются одинаковыми | Исключаются группы, в кот. один и тот же элемент стоит в разных позициях |
Существует еще и третий способ формирования комбинаторных групп: "Перестановки". В перестановках участвуют все элементы исходного множества (K=N). Перестановки с повторениями возможны, когда в исходном множестве есть повторяющиеся элементы.
Типовые алгоритмы формирования групп:
Размещения с повторениями:
Программная реализация на Бейсике for i=1 to n for j=1 to n print A(i), A(j); next j, i |
Программная реализация на Паскале for i:=1 to n do for j:=1 to n do writeln (A[i], A[j]); |
Размещения без повторений:
Программная реализация на Бейсике for i=1 to n for j=1 to n if i<>j then print A(i), A(j); next j,i |
Программная реализация на Паскале for i:=1 to n do for j:=1 to n do if i<>j then writeln (A[i], A[j]); |
Сочетания с повторениями:
Программная реализация на Бейсике ... for i=1 to n for j=i to n print A(i,j); next j, i |
Программная реализация на Паскале ... for i:=1 to n do for j:=i to n do writeln (A[i], A[j]); |
Сочетания без повторений:
Программная реализация на Бейсике ... for i=1 to n-1 for j=i+1 to n print A(i), A(j); next j, i |
Программная реализация на Паскале ... for i:=1 to n-1 do for j:=i+1 to n do writeln (A[i], A[j]); |
Задача "Кодовый замок сейфа"
Из 10 букв нужно набрать 3. Повторение букв допустимо. Подсчитать количество возможных комбинаций кодов.
Идея решения: Необходимо применить типовой алгоритм формирования групп РАЗМЕЩЕНИЯ С ПОВТОРЕНИЯМИ.
Программа на Бейсике
dim a$(10) for i=1 to 10 input "введите букву"; a$(i) next for х1=1 to 10 for х2=1 to 10 for х3=1 to 10 print a$(х1); a$(х2); a$(х3); k=k+1 next x3,x2,x1 print "k="; k
Программа на Паскале:
var a: array [1.10] of char; x1, x2, x3, k, i: integer; begin for i:=1 to 10 do readln (a[i]); for х1:=1 to 10 do for х2:= 1 to 10 do for х3:=1 to 10 do begin writeln (a[х1], a[х2], a[х3]); k:=k+1; end; writeln ('k:=', k); end.
Тест:
Задача
В ассортименте кондитерской сегодня 10 видов пирожных. Каких три пирожных продавец может предложить покупателю?
Идея решения: Необходимо применить типовой алгоритм формирования групп СОЧЕТАНИЯ С ПОВТОРЕНИЯМИ.
Программа на Бейсике
dim a$ (10) for i=1 to 10 input "введите название пирожного"; a$ (i) next for х1=1 to 10 for х2=1 to 10 for х3=1 to 10 print a$(х1); a$(х2); a$(х3) next x3,x2,x1
Программа на Паскале:
var a: array [1.10] of string; x1, x2, x3, i: integer; begin for i:=1 to 10 do begin writeln ('введите название пирожного'); readln (a[i]); end; for х1:=1 to 10 do for х2:= 1 to 10 do for х3:=1 to 10 do writeln (a[х1], a[х2], a[х3]); end.