Опубликован: 21.03.2012 | Доступ: свободный | Студентов: 2804 / 169 | Оценка: 4.44 / 4.19 | Длительность: 06:43:00
Специальности: Программист
Лекция 12:

Комбинаторика. Формирование комбинаторных групп из N по К

< Лекция 11 || Лекция 12: 12 || Лекция 13 >
Аннотация: Комбинаторные задачи бесспорные лидеры на олимпиадах. Поэтому этой теме следует уделить особое внимание. Начинать изучение данной темы нужно с азов. В лекции рассмотрен первый класс задач, в которых ОПРЕДЕЛЕНО N и K (N - количество элементов в исходном множестве, К - количество предметов, выбираемых из исходного множества). Цель лекции: сформировать понятие о комбинаторных группах и способах их получения.

Выборку по К элементов из множества А можно производить, руководствуясь правилами: считать разными выборки, в которых один и тот же элемент занимает разные позиции (либо не считать), допускать повторение одного и того же элемента в выбираемой группе (либо не допускать) и др. В зависимости от наложения определенных ограничений (правил) при выборе элементов разделяют три типа формирования комбинаторных групп. Рассмотрим их на примере:

Пусть N=4, K=2. Элементы исходного множества будем хранить в массиве А (рис.11.1):


Рис. 11.1.

Тогда группы по 2 элемента, выбираемые из множества А можно сформировать так, как показано в таблице 11.1:

Таблица 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.

Тест:

Результат: 1000

Задача

В ассортименте кондитерской сегодня 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.
< Лекция 11 || Лекция 12: 12 || Лекция 13 >
Александр Шнайдман
Александр Шнайдман
Израиль, Тель Авив