Комбинаторика - раздел математики, изучающий дискретные объекты, множества (сочетания, перестановки, размещения и перечисления элементов) и отношения на них.
Сколькими способами можно выбрать открытку и конверт для поздравления, если предлагается 3 различных конверта и 2 различных открытки?
Вы хотите выучить два иностранных языка из десяти самых распространённых. Сколько разных комбинаций языков вы можете выучить?
Сначала мы берём один из 10 языков, а потом - один из оставшихся 9: \(10 \cdot 9 = 90\).
Если элемент A можно выбрать \(n\) способами, а элемент B - \(m\) способами, то упорядоченную пару A и B можно выбрать \(n \cdot m\) способами.
Умножение используется, когда элементы выбираются последовательно друг за другом из одного множества.
Вы хотите выбрать фильм для просмотра. У вас есть выбор из 7 комедий и 8 мелодрам. Сколько всего фильмов у вас есть на выбор?
Множество комедий и мелодрам не пересекаются, значит нужно сложить количество элементов: \(7+8=15\) фильмов на выбор.
Если элемент A можно выбрать \(n\) способами, и элемент B - \(m\) способами, то A или B можно выбрать \(n + m\) способами.
Сложение используется, когда выбираем элементы из нескольких непересекающихся множеств.
Перестановками из \(n\) различных элементов называются наборы, каждый из которых содержит все эти \(n\) элементов, взятых в определенном порядке.
\[ P_n=n! \]
Порядок следования элементов в перестановке учитывается.
Список перестановок \(P_3\) для последовательности 🔴🟩🔷:
[[🔴,🟩,🔷],[🔴,🔷,🟩],[🟩,🔴,🔷],[🟩,🔷,🔴],[🔷,🔴,🟩],[🔷,🟩,🔴]]
Вы приехали на экскурсию в новый для вас город. Туристический гид говорит, что есть как минимум 4 достопримечательности, которые нужно посетить обязательно, но не сказал в каком порядке. Выведите на экран все возможные комбинации маршрутов.
\[ P_4=4!=24 \]
j).j. Сохраняем индекс элемента (k).j и k местами.j меняем на противоположный (реверсирование массива).p = [0, 1, 2, 3, 4]
n = len(p) - 1 # индекс последнего элемента
while p[0] == 0:
j = n
while p[j-1] > p[j]:
j -= 1
k = n
while p[j-1] > p[k]:
k -= 1
# вывод перестановки на экран
print(p[1:])
# обмен найденных элементов местами
p[j-1], p[k] = p[k], p[j-1]
# реверсирование части списка
p = p[:j] + list(reversed(p[j:]))Выполнить циклический сдвиг влево элементов последовательности от первого до \(k\)-го. Если \(k\)- й элемент последовательности не равен \(k\) то перейти к пункту 2. В противном случае перейти к пункту 4.
Указать новое значение \(k = k-1\). Если \(k\) равен индексу первого элемента последовательности то закончить алгоритм. В противном случае перейти к пункту 3.
Для первого вызова функции используем последовательность из элементов которой хотим получить перестановки и значение \(k\), равное ее длине.
Рекурсивно вызвать функцию передав последовательность и значение \(k-1\)
Если \(k\) четное выполнить обмен \(i\) и \(k\) элемента местами, в противном случае выполнить обмен первого элемента последовательности и \(k\).
Python-модуль itertools содержит вспомогательные функции для создания итерируемых объектов.
Генерация перестановок:
Функция permutations() генерирует все перестановки для последовательности значений. Функция возвращает итератор. Пример знакомого итератора - функция range()
Размещениями из \(n\) различных элементов по \(m\) называются наборы, каждый из которых содержит \(m\) элементов из \(n\), взятых в определенном порядке.
\[ A^{m}_n=\frac{n!}{(n-m)!} \]
Порядок следования элементов в размещении учитывается.
Список размещений \(A^2_3\) для последовательности 🔴🟩🔷:
[[🔴,🟩],[🔴,🔷],[🟩,🔴],[🟩,🔷],[🔷,🔴],[🔷,🟩]]
Студентам нужно сдать 5 экзаменов за 11 дней сессии. Сколько различных расписаний экзаменов можно составить?
\[ A^5_{11}=\frac{11!}{(11-5)!}=55440 \]
Используем модуль itertools. Функция permutations() может принимать вторым параметром количество элементов в размещении.
Сочетаниями из \(n\) различных элементов по \(m\) называются наборы, каждый из которых содержит \(m\) элементов из \(n\).
\[ C^m_n=\frac{n!}{(n-m)!\cdot m!} \]
Порядок следования элементов в сочетании не важен.
Список сочетаний \(C^2_3\) для последовательности 🔴🟩🔷:
[[🔴,🟩],[🔴,🔷],[🟩,🔷]]
Учитель литературы дал вам список из 5 книг и сказал, что за лето нужно прочитать любые 3 из них. Выведите на экран все возможные наборы из трёх книг.
Функция combinations генерирует сочетания из элементов последовательности по \(m\) элементов.
Для комбинаций без повторяющихся элементов:
На мастер-класс записалось 5 студентов, которых нужно рассадить за 5 пронумерованных столов. Посчитайте количество комбинаций рассадки и выведите их на экран.
Имена студентов вводятся с клавиатуры.
Задача на генерацию перестановок: в комбинации используются все элементы, важен их порядок.
from itertools import permutations
from math import factorial as f
stud_count = 5
names_list = []
for i in range(stud_count):
name = input("Введите имя: ")
names_list.append(name)
print(f"Количество перестановок: {f(stud_count)}")
print("Возможные рассадки студентов:")
for p in permutations(names_list):
print(p)Напишите программу с помощью корой можно выбрать из 25 учеников класса шесть человек, которые будут дежурить по школе. Посчитайте количество комбинаций и выведите одну, выбранную случайным образом.
Задача на сочетания: в комбинации не все исходные элементы и не важен порядок их следования.
Студенты одной из групп изучают 6 дисциплин по 3 пары ежедневно. Сколькими способами можно составить расписание на один день? Выведите 6 первых сгенерированных расписаний в следующем формате:
- Дисциплина 1
- Дисциплина 2
- Дисциплина 3
Задача на размещения: в комбинации не все исходные элементы, порядок элементов важен.
from itertools import permutations
subj_list = ["ПРЗИ", "ТВиМС", "КСиВК", "АСиТЧ", "СиИЭОР", "Физ-ра"]
m = 3 # количество пар в день
p = list(permutations(subj_list, m))
lst = p[:6] # первые 6 элементов списка p
print("Расписание:")
for day in lst:
print("------")
for i in range(m):
print(f"{i+1}. {day[i]}")