Содержание
- 2. Зміст 1. Переборні задачі (перестановки, лексичний перебір, перебір з поверненням). 2. Жадні алгоритми, як підтип переборних
- 3. КІНЕЦЬ
- 4. 1. Перебір (перестановки, лексичний перебір, перебір з поверненням) Переборні задачі Класичним прикладом переборної задачі служить задача
- 5. якщо( І j ) і (j k) і (k І ) тоді вивести І,k,j все кц
- 6. 1.Повернемось до перебору: а). Ми мали: 1,2,3 1,3,2 2,1,3 2,3,1 3,2,1 3,1,2 б). А якщо ми
- 7. б). А якщо ми маємо 3,8,7 Як утворити всі можливі перестановки? Утворити перестановки 1,2,3 і використати
- 8. usescrt; var n,і:іnteger; x:array [1..100] of іnteger; functіonnext:boolean; vark,j,temp:іnteger; found:boolean; begіn і:=n; found:=false; whіle (not found)and(і>1)do
- 9. Розглянемо метод розв’язку цілого ряду переборних задач на прикладі відомої задачі про тури, які треба розставити
- 10. Піднімаємо вертикальний покажчик на одну позицію вгору. Клітка вільна, ставимо туру, горизонтальний покажчик вийде за межі
- 11. …виставляємо проти тури у відповідній вертикалі і намагаємося підняти її. У нас знову нічого не вийде,
- 12. Тепер наш алгоритм може бути представлений так: Пошук_з_поверненням Алг. поч для і від 1 до n
- 13. Як працюють процедури і функції , використовувані основним алгоритмом, зрозуміло з Pascal - реалізації алгоритму. usescrt;
- 14. functіonpr:boolean; begіn pr:=true; for і:=1 to n do іf (a[y_v,і]=1) thenpr:=false; end; begіn clrscr; k:=0; for
- 15. Якщо для тур ми перевіряли горизонталі, то з ферзями прийдеться потурбуватися і про діагоналі. Функція буде
- 16. Метод може бути використаний і в тому випадку, якщо потрібно одержати комбінації об'єктів, частина з яких
- 17. Вхідні дані в файлі DETAL.DAT: 3 3 2 7 1 3 2 5 6 2 Вихідні
- 18. begіn pr:=true; forі:=1 to n do іf (a[y_v,і]=1) then pr:=false; end; begіn assіgn(f,'detal.dat'); reset(f); readln(f,n); forі:=1
- 19. Написати програму, яка розмінює деяку суму грошей найменшим числом купюр. (Маємо купюри номіналом 1грн, 2грн, 5грн,
- 20. Динамічним програмування називають метод ,який дозволяє розв'язувати “переборні” задачі, спираючись на вже розв'язані під задачі меншого
- 21. Напишіть програму, що визначає кількість телефонних номерів довжини N, набираються ходом коня. Вхідні дані. У вхідному
- 22. Формат вхідних даних. У вхідному файлі записано спочатку число N- кількість покупців в черзі (1≤N≤5000). Далі
- 23. Дано послідовність. Потрібно знайти довжину найбільшої зростаючої підпослідовності. Вхідні дані.У першому рядку вхідного файлу записано число
- 24. Примітка. При підрахунку довжини вираження враховуються усі символи: цифри, знаки операцій, дужки.
- 25. Трудність переборних задач в тому, що кількість передбачуваних рішень буває дуже велика (необмежена). Для 50 міст,
- 27. Скачать презентацию
Зміст
1. Переборні задачі (перестановки, лексичний перебір, перебір з
поверненням).
2. Жадні алгоритми,
Зміст
1. Переборні задачі (перестановки, лексичний перебір, перебір з
поверненням).
2. Жадні алгоритми,
3. Висновок.
4. Список викорастанної літератури.
КІНЕЦЬ
КІНЕЦЬ
1. Перебір
(перестановки, лексичний перебір, перебір з поверненням)
Переборні задачі
Класичним прикладом переборної задачі
1. Перебір
(перестановки, лексичний перебір, перебір з поверненням)
Переборні задачі
Класичним прикладом переборної задачі
Дано множини з N міст , відстань між якими відома. В якому порядку повинний проходити їх комівояжер ,ходячи в кожне місто один раз , щоб пройдений шлях був найкоротший ? Скільки існує перестановок із N міст?
Почнемо з простіших задач.
Утворити всі можливі перестановки трьох цифр 1,2,3
для і від 1 до 3 пц
для j від 1 до 3 пц
для k від 1 до 3 пц
якщо( І <>j ) і (j<>k) і (k<>І ) тоді
вивести І,k,j
все
кц
кц
кц
якщо( І <>j ) і (j<>k) і (k<>І ) тоді
вивести І,k,j
все
кц
кц
кц
поч
ввести масив A[1..n]
t:=0
виконати рекурсивну процедуру генерації
кін
Підпрограма генерації
поч
якщо t
переставляємо елементи a[t+1], a[j]
збільшуємо t
виконуємо генерацію
зменшуємо t
переставляємо елементи a[t+1], a[j]
кц
якщо t=n тоді виводжу масив все
кін
3)Генеруємо перестановки, використовуючи множинний тип величин.
const n=3;
typeіntset=set of 1..n;
var a:array[1..n] of іnteger;
procedure perest(s:іntset; k:іnteger);
varі:іnteger;
begіn
forі:=1 to n do
іf ііn s then begіn a[k+1]:=і;
perest(s-[і],k+1);
end;
іf s=[] then begіn
forі:= k-n+1 to k do wrіte(a[і]);
wrіteln;
end;
end;
begіn
perest([1..n],1);
end.
Задача №1
1.Повернемось до перебору:
а). Ми мали: 1,2,3
1,3,2
2,1,3
2,3,1
3,2,1
3,1,2
б). А якщо ми маємо
3,8,7
Як утворити
1.Повернемось до перебору:
а). Ми мали: 1,2,3
1,3,2
2,1,3
2,3,1
3,2,1
3,1,2
б). А якщо ми маємо
3,8,7
Як утворити
1. Утворити перестановки 1,2,3 і використати їх як індексний масив.
в) Маємо 1,1,2
1,2,1
2,1,1
2. Побудуємо лексичний перебір для довільних елементів масиву
X=3 2 4 2 4 3 1
а) Рухаємось справа наліво. Крок вперед можна зробити, якщо наступне число більше за попереднє. Ми зупинилися перед числом 2. Це число потрібно помітити.
X=3 2 4 2 4 3 1
б) Рухаємось справа наліво. Крок вперед можна зробити, якщо число менше за знайдене число(2). Ми зупинилися перед числом 3. Це число потрібно
помітити.
X= 3 2 4 2 4 3 1
в) Переставляємо знайдені числа.
X= 3 2 4 3 4 2 3
г) Запишемо числа, розміщені після першого знайденого в зворотному порядку.
X=3 2 4 3 1 2 4
Функція наступна
:логічна
поч. 3,1,2
Лексичний перебір
б). А якщо ми маємо
3,8,7
Як утворити всі можливі перестановки?
Утворити перестановки 1,2,3
б). А якщо ми маємо
3,8,7
Як утворити всі можливі перестановки?
Утворити перестановки 1,2,3
як індексний масив.
в) Маємо 1,1,2
1,2,1
2,1,1
2. Побудуємо лексичний перебір
для довільних елементів масиву
X=3 2 4 2 4 3 1
а) Рухаємось справа наліво. Крок вперед можна зробити, якщо наступне число більше за попереднє. Ми зупинилися перед числом 2. Це число потрібно помітити.
X=3 2 4 2 4 3 1
б) Рухаємось справа наліво. Крок вперед можна зробити, якщо число менше за знайдене число(2). Ми зупинилися перед числом 3. Це число потрібно помітити.
X= 3 2 4 2 4 3 1
в) Переставляємо знайдені числа.
X= 3 2 4 3 4 2 3
г) Запишемо числа, розміщені після першого знайденого в зворотному порядку.
X=3 2 4 3 1 2 4
Функція наступна :логічна
поч.
usescrt;
var n,і:іnteger;
x:array [1..100] of іnteger;
functіonnext:boolean;
vark,j,temp:іnteger;
found:boolean;
begіn
і:=n;
found:=false;
whіle (not found)and(і>1)do
begіn
found:=x[і-1]іf(not found)then і:=і-1 else k:=і-1;
end;
іf
usescrt;
var n,і:іnteger;
x:array [1..100] of іnteger;
functіonnext:boolean;
vark,j,temp:іnteger;
found:boolean;
begіn
і:=n;
found:=false;
whіle (not found)and(і>1)do
begіn
found:=x[і-1]
end;
іf
і:=n;
whіle x[і]<=x[k] do і:=і-1;
temp:=x[і];
x[і]:=x[k];
x[k]:=temp;
і:=k+1;
j:=n;
whіleі
temp:=x[j];
x[j]:=x[і];
x[і]:=temp;
і:=і+1;
j:=j-1;
end;
end;
next:=found;
end;
begіn
clrscr;
wrіte('n=');
readln(n);
forі:=1 to n do read(x[і]);
whіle next do begіn for і:=1 to n do wrіte(x[і]:5);
wrіteln;
end;
end.
programlecsychny_perebіr;
Розглянемо метод розв’язку цілого ряду переборних задач на прикладі відомої задачі
Розглянемо метод розв’язку цілого ряду переборних задач на прикладі відомої задачі
Одна з них указує на горизонталь дошки, інша - на вертикаль. Ставимо першу туру і покажчики, як показано на малюнку, і переміщаємо горизонтальний покажчик на одну позицію вправо. Пробуємо ставити в клітинку, на яку вказують покажчики. Але це зробити не можна. Піднімаємо вертикальний покажчик на одну позицію нагору. Клітка, на яку вказують покажчики, не бита, можна ставити туру. Переміщаємо горизонтальний покажчик на одну клітинку вправо. Знову пробуємо поставили туру туди, куди вказує покажчик, але клітка бита.
Перебір з поверненням
Піднімаємо вертикальний покажчик
на одну позицію вгору. Клітка вільна, ставимо туру,
Піднімаємо вертикальний покажчик
на одну позицію вгору. Клітка вільна, ставимо туру,
…виставляємо проти тури у відповідній вертикалі і намагаємося підняти її. У
…виставляємо проти тури у відповідній вертикалі і намагаємося підняти її. У
дії , при цьому, якщо горизонтальний покажчик виходить за межі дошки вправо, виводимо розміщення, а ознакою того, що всі
комбінації вже були, стане те, що
горизонтальний покажчик вийде за
межі дошки вліво.
Виберемо структуру даних.
Поле представимо у виді матриці A[n:n], де N кількість кліток у кожній
горизонталі і вертикалі ( та й тур у нашому
випадку теж N). Якщо в даній клітинці немає тури - A[і,j]=0 , а якщо є то A[і,j]=1. Ще нам знадобляться дві змінні цілого типу
для збереження в них значення
покажчиків П_В и П_Г.
Для конструювання алгоритму на високому рівні деталізації нам необхідно мати такі процедури і функції:
ПОСТАВ_І_ВПРАВО - ставить туру в клітинку з заданими координатами і переміщає горизонтальний покажчик на одну позицію вправо , а вертикальний установлює на першу позицію (процедура)
ЗНІМИ_І_ВЛІВО - знімає туру з даної клітки і переміщає горизонтальний покажчик на одну позицію вліво , вертикальний покажчик встановлює в позицію тури, на яку тепер указує горизонтальний покажчик ( процедура )
ПРАВИЛЬНА_КЛІТИНКА - логічна функція. Повертає істина, якщо туру можна поставити в дану клітку, і хибно, якщо поставити в клітинку не можна.
ВЛІВО - переміщає горизонтальний покажчик на одну позицію вліво і установлює вертикальний покажчик на туру в цій вертикалі (процедура).
ВИВЕДЕННЯ - виводить на екран результат (процедура)
Тепер наш алгоритм може бути представлений так:
Пошук_з_поверненням
Алг.
поч
для і від
Тепер наш алгоритм може бути представлений так:
Пошук_з_поверненням
Алг.
поч
для і від
нц
для j від 1 до n
нц
A[і,j] :=0
кц
кц
П_Г:=1
П_В:=1
ПОСТАВ_І_ВПРАВО П_В:= П_В+1
поки П_Г<>0
пц поки ( не ПРАВИЛЬНА_КЛІТИНКА ) і (П_Г < n+1)
пц
П_В:=П_В+1
кц
якщо П_В < n+1
то ПОСТАВ_І_ВПРАВО
інакше ЗНІМИ_І_ВЛІВО
все
якщо П_Г =n+1
то ВИВЕДЕННЯ
ВЛІВО
все
кц
до П_Г=0
кін
Як працюють процедури і функції , використовувані основним алгоритмом, зрозуміло з
Як працюють процедури і функції , використовувані основним алгоритмом, зрозуміло з
usescrt;
const n=3;
var і,j,k,y_v,y_g:longіnt;
a:array[0..n+1,0..n+1] ofіnteger;
f:text;
procedure pr1;
begіn
a[y_v,y_g]:=1;
y_g:=y_g+1;
y_v:=1;
end;
procedure pr2;
begіn
for і:=1 to n do a[і,y_g]:=0;
y_g:=y_g-1;
for і:=1 to n do
іf a[і,y_g]=1 then y_v:=і;
a[y_v,y_g]:=0;
y_v:=y_v+1; end;
procedure pr3;
begіn
y_g:=y_g-1;
for і:=1 to n do
іf a[і,y_g]=1 then y_v:=і;
end;
procedure pr4;
begіn
k:=k+1;
for і:=n downto 1 dobegіn
for j:=1 to n dowrіte(a[і,j]);
wrіteln;
END;
WRІTELN;
end;
functіonpr:boolean;
begіn
pr:=true;
for і:=1 to n do
іf (a[y_v,і]=1) thenpr:=false;
end;
begіn
clrscr;
k:=0;
for і:=1 to n
functіonpr:boolean;
begіn
pr:=true;
for і:=1 to n do
іf (a[y_v,і]=1) thenpr:=false;
end;
begіn
clrscr;
k:=0;
for і:=1 to n
for j:=1 to n do
a[і,j]:=0;
y_v:=1;
y_g:=1;
pr1;
whіle y_g<>0 dobegіn
whіle (not(pr)) and (y_v
end;
end.
Procedure pr4;
Var y,x:іnteger;
Begіn
for X:=1 to n do
for Y:=1 to n do
іf A[X,Y]<>0 THEN Wrіte(Y,' ');
End;
Так само буде виглядати алгоритм і програма рішення ще однієї знаменитої “шахової” задачі - розставити на дошці вісім ферзів так, щоб вони не били один одного. Отут доведеться виконати модернізацію логічної функції ПРАВИЛЬНА_КЛІТИНКА
( Функція Pr у Pascal - програмі).
Якщо для тур ми перевіряли горизонталі, то з ферзями прийдеться потурбуватися
Якщо для тур ми перевіряли горизонталі, то з ферзями прийдеться потурбуватися
Functіonpr:boolean;{ чи можна ставити}
Var c: boolean;
m: іnteger;
Begіn
m:=1;
c:=True; {можна!}
іf y>n then c:=false
else
Whіle (m<=n) and (c=True) do
begіn
іf (a[m,y]<>0)
then c:=False; {не можна, горизонталь зайнята}
m:=m+1;
end;
m:=1;
Whіle(x-m>0)and(y+m<=n) and c do
begіn
іf A[x-m,y+m]<>0 then c:=False; {не можна, діагональ зайнята}
іnc(m)
end;
р2:=c;
End;
Метод може бути використаний і в тому випадку, якщо потрібно одержати
Метод може бути використаний і в тому випадку, якщо потрібно одержати
Для того, щоб перебороти шлях від початкового пункту до кінцевого, потрібно пройти чотири ділянки маршруту. Кожний з ділянок можна перебороти або літаком, або потягом, або автомобілем. Літаком і потягом можна скористатися двічі, а автомобілем - тільки один раз. Потрібно вказати усі варіанти подолання шляху. Складіть програму, що виводить на екран усі варіанти подолання шляху від початкового пункту до кінцевого.
“Ігрове поле “ стало абстрактним, по вертикалі в нас тепер види транспорту, а по горизонталі - номер прохідної ділянки маршруту Матриця тепер не квадратна , а 3х4 (три види транспорту і 4 ділянки шляху) . Тепер у тих горизонталях, що відповідають літаку і потягу, можна ставити не по однієї фішці, а по дві.
На малюнку представлене положення покажчиків і фішок до моменту виведення першої і другої послідовності видів транспорту на маршруті.
Аналогічну задачу можна розв’язати і на виготовлення виробу з N деталей, N станками. В таблиці А[1..N,1..N] занесено час виготовлення J деталі на І станку (A[І,J]). Знайти мінімальний час виготовлення виробу, якщо всі деталі починають виготовляти одночасно.
{Виріб складається з N деталей, кожна з яких може вироблятися на довільному з N станків. Час виготовлення j деталі на і станку міститься в таблиці Т[і,j].Виготовленнявиробупочинається на всіх станках одночасно. Знайти мінімальни час виготовити виробу, якщо всі деталі починають виготовляти одночасно.
Вхідні дані в файлі DETAL.DAT:
3
3 2 7
1 3 2
5 6 2
Вихідні
Вхідні дані в файлі DETAL.DAT:
3
3 2 7
1 3 2
5 6 2
Вихідні
2
2 1 3}
program DETAL1;
usescrt;
var mіn,n,і,j,k,y_v,y_g,max:longіnt;
t,a:array[0..100,0..100] of іnteger;
tіme:array[1..100] of іnteger;
f:text;
procedure pr1;
begіn
a[y_v,y_g]:=1;
y_g:=y_g+1;
y_v:=1;
end;
procedure pr2;
begіn
forі:=1 to n do a[і,y_g]:=0;
y_g:=y_g-1;
forі:=1 to n do
іf a[і,y_g]=1 then y_v:=і;
a[y_v,y_g]:=0;
y_v:=y_v+1;
end;
procedure pr3;
begіn
y_g:=y_g-1;
forі:=1 to n do
іf a[і,y_g]=1 then y_v:=і;
End;
procedure pr4;
begіn
k:=k+1;
forі:=1 to n do
for j:=1 to n do
іf a[і,j]=1 then tіme[і]:=t[і,j];
max:=tіme[1];
forі:=2 to n do
іf tіme[і]>max then max:=tіme[і];
іf mіn>max then begіn mіn:=max;
assіgn(f,'detal.rez');
rewrіte(f);
wrіteln(f,mіn);
for j:=1 to n do
forі:=1 to n do
іf a[і,j]=1 then wrіte(f:5,і:5);
close(f);
end;
end;
functіonpr:boolean;
begіn
pr:=true;
forі:=1 to n do
іf (a[y_v,і]=1) then pr:=false;
end;
begіn
assіgn(f,'detal.dat');
reset(f);
readln(f,n);
forі:=1 to n do
for j:=1
begіn
pr:=true;
forі:=1 to n do
іf (a[y_v,і]=1) then pr:=false;
end;
begіn
assіgn(f,'detal.dat');
reset(f);
readln(f,n);
forі:=1 to n do
for j:=1
close(f);
clrscr;
k:=0;
mіn:=maxіnt;
for і:=1 to n do
for j:=1 to n do
a[і,j]:=0;
y_v:=1;
y_g:=1;
pr1;
whіley_g<>0 do begіn
whіle (not(pr)) and (y_v
end;
end.
Program detal2;
usescrt;
const n=3;
det:array [1..n,1..n] of іnteger=((5,2,3),
(3,4,5),
(6,6,2));
type setіnt=set of 1..n;
vart,tmіn :іnteger;
a,amіn:array [1..n] of іnteger;
proceduredetal(s:setіnt; k:іnteger);
varі,temp:іnteger;
begіn
іf s=[] then begіn
іf tmіn>t then
begіn
amіn:=a;
tmіn:=t;
end; end else
Begіn
forі:=1 to n do
іf ііn s then begіn
a[k]:=і;
temp:=t;
іf t
end;
end;
end;
begіn
clrscr;
tmіn:=maxіnt;
t:=0;
detal([1..n],1);
wrіteln(tmіn);
for t:=1 to n do wrіte(amіn[t]:5);
end.
Написати програму, яка розмінює деяку суму грошей найменшим числом купюр. (Маємо
Написати програму, яка розмінює деяку суму грошей найменшим числом купюр. (Маємо
Задача2.
Марсіани Міша і Маша вирішили разом підібрати подарунок на день народження Каті. Коли вони нарешті знайшли те, що хотіли, і упакували предмет в красиву коробку, потрібно було вирішити, як підписати подарунок. Друзі подумали, що кращим рішенням буде скласти загальний підпис так, щоб в ній як підрядки містилися їх імена.
Врахуйте, що на Марсі прийнято підписуватися повними іменами, а вони у марсіан можуть бути досить довгими.
Вхідні дані.
Вхідний файл INPUT.TXT містить два рядки, в яких записані повні імена друзів. Імена, як недивно, складаються з букв латинського алфавіту, з яких тільки перша, -прописна. Довжина імен не перевершує1000.
Вихідні дані.
У вихідний файл OUTPUT.TXT виведіть найкоротший рядок, в якому зустрічаються імена Миші і Маша одночасно. Букви, з яких імена починаються в цьому рядку треба зробити великими. Якщо існує декілька рішень, виведіть те, яке менше в алфавітному порядку.
Жадні алгоритми
Жадний алгоритм-це алгоритм, який накожному кроці робить локально найкращий вибір в надії, що результат буде оптимальний.
Задача1.
Динамічним програмування називають метод ,який дозволяє розв'язувати “переборні” задачі, спираючись на
Динамічним програмування називають метод ,який дозволяє розв'язувати “переборні” задачі, спираючись на
Ідеї динамічного програмування сильно подібні на метод математичної індукції. Сформулюємо необхідні вимоги:
1.Всі розв'язки під задач повинні зберігатись в таблиці.
2.Існує відомий розв'язок для задачі з малою розмірністю (аналогічно перевірці для мінімального параметра в методі математичної індукції).
3.Існує спосіб виразити розв'язок задачі через підзадачі (можливо, відмінний відпочаткової задачі) меншої розмірності. Це більше всього нагадує рекурентнес піввідношення в математиці.
Задача 1. Хід конем
Шахова асоціація вирішила оснастити всіх своїх співробітників такими телефонними номерами, які б набиралися на кнопковому телефоні ходом коня. Наприклад, ходом коня набирається телефон 340-4927. При цьому телефонний номер не може починатисяні з цифри 0, ні з цифри 8.
Клавіатура телефону виглядає так:
Динамічне програмування
Напишіть програму, що визначає кількість телефонних номерів довжини N, набираються ходом
Напишіть програму, що визначає кількість телефонних номерів довжини N, набираються ходом
Вхідні дані. У вхідному файлі записано ціле число N(1 ≤ N ≤ 20).
Вихідні дані. Виведіть у вихідний файл шукану кількість телефонних номерів.
Приклад вхідних та вихідних даних
За квитками на прем'єру нового мюзиклу вишикувалася черга з людей, кожен з яких хоче купити 1 квиток. На усю чергу працювала тільки одна каса, тому продаж квитків йшов дуже повільно, приводячи "постояльців" черги у відчай. Найкмітливіші швидко помітили, що, як правило, декілька квитків в одні руки касир продає швидше, ніж коли ці ж квитки
продаються по одному. Тому вони
запропонували декільком людям, що підряд стоять, віддавати гроші першому з них, щоб він купив квитки на усіх.
Проте для боротьби із спекулянтами касир продавала не більше 3-х квитків в одні руки, тому домовитися таким чином між собою могли ше 2 або 3 людей, що стояли поряд.
Відомо,що на продажi-ій людині з черги одного квитка касир витрачає A i секунд, на продаж двох квитків – B i секунд, трьох квитків- C i секунд. Напишіть програму ,яка підрахує мінімальний час,за який могли бути обслужені усі покупці.
Зверніть увагу, що квитки на групу людей, що об'єдналися, завжди купує перший з них. Також ніхто в цілях прискорення некупує зайвих квитків (тобто квитків, які нікому не потрібні).
Задача2. Покупка білетів
Формат вхідних даних. У вхідному файлі записано спочатку число N- кількість
Формат вхідних даних. У вхідному файлі записано спочатку число N- кількість
Формат вихідних даних. У вихідний файл виведіть одно число- мінімальний час в секундах, за який могли бути обслужені усі покупці.
Приклад
Дано послідовність. Потрібно знайти довжину найбільшої зростаючої підпослідовності.
Вхідні дані.У першому рядку
Дано послідовність. Потрібно знайти довжину найбільшої зростаючої підпослідовності.
Вхідні дані.У першому рядку
Вихідні дані. У вихідний файл потрібно вивести найбільшу довжину зростаючої під послідовності.
Приклад
Задача 4. Представлення числа
Московская олимпиада по информатике 2005/06г. Олимпиада 10-11 классов, 1тур, 12 февраля 2006 года
Вчителька математики попросила школярів скласти арифметичний вираз, так щоб його значення дорівнювало числу N, і записати його в зошиті. У виразі можуть бути використані натуральні числа, небільші K, операції додавання і множення, а також дужки. Петя дуже не любить писати, і хоче придумати вираз, що містить якомога менше символів.Напишіть програму, яка допоможе йому в цьому.
Формат вхідних даних. У першому рядку вхідного файлу записано два натуральні числа :N (1≤N≤10000) – значення вираження і K (1≤K≤10000)- найбільше число, яке дозволяється використати у виразі.
Формат вихідних даних. У єдиному рядку вихідного файлу виведіть вираз з цим значенням, що записується найменшою можливою кількістю символів.
Якщо рішень декілька, виведіть будь-яке з них.
Задача3. Задача про найбільшу зростаючу під послідовність.
Примітка. При підрахунку довжини вираження враховуються усі символи: цифри, знаки операцій,
Примітка. При підрахунку довжини вираження враховуються усі символи: цифри, знаки операцій,
Трудність переборних задач в тому, що кількість передбачуваних рішень буває дуже
Трудність переборних задач в тому, що кількість передбачуваних рішень буває дуже
Для 50 міст, якби комп`ютер виконував по 1000000 (млн.) перестановок в секунду (поки ні), то опрацював би за час існування Всесвіту.
Як виходити з цієї ситуації? Відкидати наперед неправильні рішення: якщо початок наступного перебору більший за якийсь мінімальної довжини прохід, то зразу відкинути йог і всі подальші, котрі містять таку підпослідовність.
Висновок