Комбинаторика. Формирование комбинаторных групп из 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.
