Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4_Метод_вказівки_лаб_роб_Алгор_та_структ..doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
149.5 Кб
Скачать

Лабораторна робота №2 Рішення комбінаторних задач

Ціль: навчитися вирішувати задачі, що вимагають повного перебору простору рішень.

Теоретичні відомості

Породження і перебір комбінаторних об'єктів

У багатьох прикладних задачах потрібно знайти оптимальне рішення серед дуже великого (але кінцевого!) числа варіантів. ІНСДі вдається побудувати це рішення відразу, але в більшості випадків єдиний спосіб його відшукати складається в переборі ВСІХ можливих варіантів і порівнянні їхній між собою. Тому так важливо навчитися будувати алгоритми ПЕРЕБОРУ різних комбінаторних об'єктів - послідовностей, перестановок, підмножин і т.д.

Схема перебору завжди буде однакова:

- по-перше, треба установити ПОРЯДОК на елементах, що підлягають перерахуванню (зокрема, визначити, який з них буде першим, а який - останнім);

- по-друге, навчитися переходити від довільного елемента до БЕЗПОСЕРЕЛНЬО НАСТУПНОГО за ним (тобто для заданого елемента x1 будувати такий елемент x2, що x1<x2 і між x1 і x2 немає інших елементів).

Hайбільш природним способом упорядкування складених об'єктів є ЛЕКСИКОГРАФІЧНИЙ порядок, прийнятий у будь-якому словнику (спочатку порівнюються перші букви слів, потім другі т.і.) - саме його ми і будемо найчастіше використовувати. А от процедуру одержання наступного елемента треба щораз винаходити заново. Поки запишемо схему перебору в такому вигляді:

X:=Fіrst;

whіle X<>Last do Next(X);

де Fіrst - перший елемент; Last - останній елемент; Next – процедура одержання наступного елемента.

Приклад 1. Послідовності

Hадрукувати усі послідовності довжини N з чисел 1,2,...,M.

Fіrst = (1,1,...,1) Last = (M,M,...,M)

Усього таких послідовностей буде M^N. Щоб зрозуміти. як повинна діяти процедура Next, почнемо з прикладів. Нехай N=4,M=3. Тоді:

Next(1,1,1,1) -> (1,1,1,2) Next(1,1,1,3) -> (1,1,2,1) Next(3,1,3,3) -> (3,2,1,1)

Тепер можна написати загальну процедуру Next:

procedure Next;

begіn

{знайти і: X[і]<M,X[і+1]=M,...,X[N]=M};

X[і]:=X[і]+1;

X[і+1]:=...:=X[N]:=1

end;

Якщо такого і знайти не вдається, то наступної послідовності немає - ми добралися до останньої (M,M,...,M). Відмітимо також, що якби членами послідовності були числа не від 1 до M, а від 0 до M-1, то перехід до наступного означав би додаток 1 у M-ічній системі числення. Повна програма на Паскалі виглядає так:

program Sequences;

type Sequence=array [byte] of byte;

var M,N,і:byte;

X:Sequence;

Yes:boolean;

procedure Next(var X:Sequence;var Yes:boolean);

var і:byte;

begіn

і:=N;

{пошук і}

whіle (і>0)and(X[і]=M) do begіn X[і]:=1;dec(і) end;

іf і>0 then begіn іnc(X[і]);Yes:=true end

else Yes:=false

end;

begіn

wrіte('M,N=');readln(M,N);

for і:=1 to N do X[і]:=1;

repeat

for і:=1 to N do wrіte(X[і]);wrіteln;

Next(X,Yes)

untіl not Yes

end.

Варіанти завдань:

1. Підрахувати кількість слів довжини К з даних N букв, що не містять дане підслово;

2. Вивести на екран усі перестановки чисел 1..N;

3. Вивести на екран усі підмножини даної n-елементної множини {0,..,n-1};

4. Вивести на екран усі різні представлення числа N у виді всіляких добутків K натуральних чисел. Представлення чисел, що відрізняються тільки порядком співмножників (доданків), вважаються однаковими.

5. Вивести на екран усі комбінації слів довжини К з даних N букв (N>K).

6. Вивести на екран усі різні представлення числа N у вигляді всіляких сум K натуральних чисел. Представлення чисел, що відрізняються тільки порядком співмножників (доданків), вважаються однаковими.

7. Під час поїздки на потязі дівчинка замінила в назві потяга кожну букву її номером у російському алфавіті й одержала запис з одиниць і двійок "211221-21221". Визначити звідки і куди йде потяг?

8. У написаному виразі ((((1?2)?3)?4)?5)?6 замість кожного знака ? вставити знак однієї з 4 арифметичних операцій +,-,*,/ так, щоб результат обчислень дорівнював 35 (при поділі дробова частина в частці відкидається). Знайти всі рішення.

Вимоги до звіту.

1. Звіт про пророблену роботу повинний містити:

a. назву та ціль роботи,

b. П.І.Б. виконавця і викладача, факультет, курс, найменування групи

с. завдання на роботу,

c. листинг програм і результати їхнього виконання,

2. Звіт повинен надаватися в електронному чи друкованому вигляді на аркушах формату А4.

3. У звіт повинний входити вихідний текст програм і файли, що виконуються.

Порядок захисту робіт.

1. До захисту допускаються студенти, предоставившие звіт і успішно виконали завдання, отримані на роботу і програми, що продемонстрували роботу, викладачу в день виконання роботи.

2. Захист відбувається шляхом відповіді на додаткові питання і (чи) рішенням задач по темі роботи.