Россия, Москва, МИЭМ |
Комбинаторика. Формирование комбинаторных групп из N по К
Задачи из "Теории чисел"
Найти все 3-хзначные числа, сумма цифр которых равна К (введенному с клавиатуры)
Идея решения: Необходимо применить типовой алгоритм формирования групп РАЗМЕЩЕНИЯ С ПОВТОРЕНИЯМИ.
Программа на Бейсике
Input "k="; k for х1=1 to 9 for х2= 0 to 9 for х3=0 to 9 if х1+х2+х3=k then print х1; х2; х3 next x3,x2,x1
Программа на Паскале:
var x1, x2, x3, k: integer; begin writeln ('k='); readln (k); for х1:=1 to 9 do for х2:=0 to 9 do for х3:=0 to 9 do if х1+х2+х3=k then writeln (х1, х2, х3); end.
Тест:
Подсчитать количество 'счастливых' троллейбусных билетов ("счастливые" номера билетов - шестизначные числа, в которых сумма первых трех цифр равна сумме вторых трех цифр).
Идея решения: Необходимо применить типовой алгоритм формирования групп РАЗМЕЩЕНИЯ С ПОВТОРЕНИЯМИ.
Программа на Бейсике:
for х1=1 to 9 for х2=0 to 9 for х3=0 to 9 for х4=0 to 9 for х5=0 to 9 for х6=0 to 9 if x1+x2+x3=x4+x5+x6 then k=k+1 next x6, x5, x4, x3, x2, x1 print "k="; k
Программа на Паскале:
var x1, x2, x3, k: integer; begin k:=0; for х1:=1 to 9 do for х2:=0 to 9 do for х3:=0 to 9 do for х4:=0 to 9 do for х5:=0 to 9 do for х6:=0 to 9 do if x1+x2+x3=x4+x5+x6 then k:=k+1; writeln ('k=', k); end.
Тест:
Геометрические задачи
На плоскости N точек заданы своими координатами. Найти "центральную" точку (точку, сумма расстояний от которой до остальных точек максимальна).
Идея решения: Необходимо применить типовой алгоритм формирования групп РАЗМЕЩЕНИЯ БЕЗ ПОВТОРЕНИЙ. Для поиска максимальной суммы расстояний применим типовой алгоритм ПОИСКА МАКСИМАЛЬНОГО ЭЛЕМЕНТА.
Программа на Бейсике:
input "введите количество точек"; n dim x (n), y (n) for i=1 to n input "введите пары координат"; x(i), y(i) next for i=1 to n s=0 for j:=1 to n s=s+ sqr ((x(i)-x(j))^2+(y(i)-y(j))^2) next if s>max then max=s: num=i next print "это точка с координатами-"; x(num), y(num)
Программа на Паскале:
var x,y:array [1..10] of integer; i,j,n,num,max:integer; begin writeln ('введите количество точек'); readln (n); for i:=1 to n do begin writeln ('введите пары координат'); readln (x[i], y[i]); end; for i:=1 to n do begin s:=0; for j:=1 to n do s:=s+ sqrt (sqr(x[i]-x[j])+sqr(y[i]-y[j])); if s>max then begin max:=s; num:=i; end; end; writeln (x[num], y[num]); End.
Тест:
На плоскости N точек заданы своими координатами. Найти 2 наиболее удаленные друг от друга точки.
Идея решения: Необходимо применить типовой алгоритм формирования групп СОЧЕТАНИЯ БЕЗ ПОВТОРЕНИЙ. Для поиска двух наиболее удаленных точек применим типовой алгоритм ПОИСКА МАКСИМАЛЬНОГО ЭЛЕМЕНТА.
Программа на Бейсике:
input "введите количество точек"; n dim x(n), y(n) for i = 1 to n input "введите пары координат"; x(i), y(i) next for i = 1 to n - 1 for j = i + 1 to n ras = sqr((x(i)-x(j))^ + (y(i)-y(j))^2) if ras < max then max = ras: num1 = i: num2 = j next j, i print x(num1); y(num1); "-"; x(num2); y(num2)
Программа на Паскале:
var x,y:array [1..10] of integer; n,i,j,num1,num2:integer; ras,max:real; begin writeln ('введите количестов точек'); readln (n); for i:=1 to n do begin writeln ('введите пары координат'); readln (x[i], y[i]); end; {=================================} for i:=1 to n-1 do for j:=i+1 to n do begin ras:= sqrt(sqr(x[i] - x[j]) +sqr (y[i] - y[j])) ; if ras > max then begin max:=ras; num1:=i; num2:=j; end; end; writeln (x[num1], y[num1], '-', x[num2], y[num2]); end.
Тест:
На плоскости N точек заданы своими координатами. Найти минимальный радиус окружности, включающей в себя все точки.
Идея решения:
Минимальной будет окружность, на которой находятся хотя бы три точки (рис.11.2). Необходимо найти такие три точки, сумма расстояний между которыми максимальна. Необходимо применить типовой алгоритм формирования групп СОЧЕТАНИЯ БЕЗ ПОВТОРЕНИЙ.
Радиус описанной окружности:R=(abc)/(4S)
В приведенных ниже программах находятся координаты трех, наиболее удаленных друг от друга точек. Вычислить R не составит труда (проделайте это самостоятельно).
Программа на Бейсике:
input "n="; n dim x(n), y(n) print "x=, y=" for i = 1 to n input x(i), y(i) next for i = 1 to n - 2 for j = i + 1 to n - 1 for r = j + 1 to n ras1 = sqr((x(r) - x(j)) ^ 2 + (y(r) - y(j)) ^ 2) ras2 = sqr((x(j) - x(i)) ^ 2 + (y(j) - y(i)) ^ 2) ras3 = sqr((x(i) - x(r)) ^ 2 + (y(i) - y(r)) ^ 2) if (ras1+ras2+ras3)>max then max=(ras1+ras2+ras3): num1=i: num2=j: num3=r next r, j, i print x(num1); y(num1); "-"; x(num2); y(num2); "-"; x(num3); y(num3)
Программа на Паскале:
var x,y: array [1..10] of integer; n,i,j,r,num1,num2,num3: integer; ras1,ras2,ras3,max: real; begin writeln ('введите количестов точек'); readln (n); for i:=1 to n do begin writeln ('введите пары координат'); readln (x[i], y[i]); end; max:=0; for i:= 1 to (n - 2) do for j:= i + 1 to (n - 1) do for r:= j + 1 to n do begin ras1:=sqrt(sqr(x[r]-x[j])+sqr(y[r]-y[j])); ras2:=sqrt(sqr(x[j]-x[i])+sqr(y[j]-y[i])); ras3:=sqrt(sqr(x[i]-x[r])+sqr(y[i]-y[r])); if (ras1+ras2+ras3)>max then begin max:=(ras1+ras2+ras3); num1:=i; num2:=j; num3:=r; end; end; writeln (x[num1],' ',y[num1], '-',x[num2],' ',y[num2], '-', x[num3],' ',y[num3]); end.
Тест:
Ключевые термины
- Комбинаторная группа - выборка элементов из исходного множества.
- Размещения - формирование комбинаторных групп по правилам: считать разными выборки, в которых один и тот же элемент занимает разные позиции. Существуют с повторениями и без.
- Сочетания - считать одинаковыми выборки, в которых один и тот же элемент занимает разные позиции. Существуют с повторениями и без.
- Перестановки - в выборке участвуют все элементы исходного множества (K=N). Перестановки с повторениями возможны, когда в исходном множестве есть повторяющиеся элементы
- (либо не считать), допускать повторение одного и того же элемента в выбираемой группе (либо не допускать) и др.
Краткие итоги
Примеры формирования комбинаторных групп из исходного множества {0, 1, 2} по 2 приведены в таблице 11.2:
Размещения | Сочетания | ||
---|---|---|---|
С повторениями | Без повторений | С повторениями | Без повторений |
00, 01, 02, | 01, 02, | 00, 01, 02, | 01, 02, |
10, 11, 12, | 10, 12, | 11, 12, | 12 |
20, 21, 22 | 20, 21 | 22 | |
Группы {01} и {10} считаются различными | Исключаются группы, в кот. один и тот же элемент стоит в разных позициях | Группы {01} и {10} считаются одинаковыми | Исключаются группы, в кот. один и тот же элемент стоит в разных позициях |
В перестановках участвуют все элементы исходного множества (K=N). Перестановки с повторениями возможны, когда в исходном множестве есть повторяющиеся элементы.
Набор для практики
Вопросы.
- Назовите основные типы комбинаторных групп.
- По каким правилам создаются всевозможные комбинации предметов определенного типа из набора данных?
- В каких случаях возможно сформировать перестановки с повторениями?
Упражнения.
- На карте обозначены N станций (названия станций - А1, А2, А3, …). Требуется рассчитать материальные затраты на строительство автомобильных дорог между станциями. Для этого необходимо написать программу, выдающую запрос на ввод с клавиатуры стоимости дороги между двумя всевозможными станциями и выдающую на экран суммарную стоимость затрат на строительство.
- В некоторой фирме составляют график отпусков. Каждый сотрудник уходит 2 раза в год в 2-хнедельный отпуск. Написать программу для вывода на экран табличной ведомости для заполнения графика отпусков с 2 колонками: первой в формате "Месяц-1_Месяц 2" и второй пустой (в ней сотрудники будут ставить свои ФИО).
- При помощи 5 различных трафаретов нужно нарисовать три картинки в ряд. Выведите на экран всевозможные комбинации.
- На 4 уроках в начальной школе преподают предметы: математику, письмо, чтение, рисование, музыку, физкультуру и труд. Вывести на экран всевозможные варианты расписания предметов на день.