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

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

< Лекция 11 || Лекция 12: 12 || Лекция 13 >
Задачи из "Теории чисел"

Найти все 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.

Тест:

Дано: 3
Результат:

102

111

120

201

210

300

Подсчитать количество 'счастливых' троллейбусных билетов ("счастливые" номера билетов - шестизначные числа, в которых сумма первых трех цифр равна сумме вторых трех цифр).

Идея решения: Необходимо применить типовой алгоритм формирования групп РАЗМЕЩЕНИЯ С ПОВТОРЕНИЯМИ.

Программа на Бейсике:

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.

Тест:

Результат: 46242
Геометрические задачи

На плоскости 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=5
1,6
4,2
6,5
7,10
10,3
Результат: 7,10

На плоскости 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=6
3,5
6,8
7,6
9,12
15,10
13,3
Результат: 3,5 - 15,10

На плоскости N точек заданы своими координатами. Найти минимальный радиус окружности, включающей в себя все точки.

Идея решения:

Минимальной будет окружность, на которой находятся хотя бы три точки (рис.11.2). Необходимо найти такие три точки, сумма расстояний между которыми максимальна. Необходимо применить типовой алгоритм формирования групп СОЧЕТАНИЯ БЕЗ ПОВТОРЕНИЙ.


Рис. 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.

Тест:

Дано:
N=8
4,11
3,7
4,3
7,10
6,7
6,2
11,8
9,5
Результат: 4,11-6,2-11,8
Ключевые термины
  • Комбинаторная группа - выборка элементов из исходного множества.
  • Размещения - формирование комбинаторных групп по правилам: считать разными выборки, в которых один и тот же элемент занимает разные позиции. Существуют с повторениями и без.
  • Сочетания - считать одинаковыми выборки, в которых один и тот же элемент занимает разные позиции. Существуют с повторениями и без.
  • Перестановки - в выборке участвуют все элементы исходного множества (K=N). Перестановки с повторениями возможны, когда в исходном множестве есть повторяющиеся элементы
  • (либо не считать), допускать повторение одного и того же элемента в выбираемой группе (либо не допускать) и др.
Краткие итоги

Примеры формирования комбинаторных групп из исходного множества {0, 1, 2} по 2 приведены в таблице 11.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 уроках в начальной школе преподают предметы: математику, письмо, чтение, рисование, музыку, физкультуру и труд. Вывести на экран всевозможные варианты расписания предметов на день.
< Лекция 11 || Лекция 12: 12 || Лекция 13 >