Backtracking_2018

Documente similare
E_d_Informatica_sp_MI_2015_bar_02_LRO

Diapositive 1

SUBPROGRAME

E_d_Informatica_sp_SN_2014_bar_10_LRO

ALGORITHMICS

ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine număru

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f

Microsoft Word - CarteC.doc

Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare

Subiectul 1

Microsoft Word - CarteC.doc

Probleme proiect TP BITPERM Implementați un algoritm care citește de la intrarea standard două numere naturale și scrie la ieșirea standard da

Ecuatii si sisteme de ecuatii neliniare 1 Metoda lui Newton Algorithm 1 Metoda lui Newton pentru ecuaţia f(x) = 0. Date de intrare: - Funcţia f - Apro

Probleme rezolvate informatica: Probleme rezolvate grafuri si a

Programarea şi utilizarea calculatoarelor

Ministerul Educatiei, Cercetarii si Tineretului Grup Scolar Gh. Asachi Galati Proiect pentru obtinerea certificatului de competente profesionale Speci

Microsoft Word - cap1p4.doc

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

Microsoft PowerPoint - Curs_SDA_10_RO_2019_v1.pptx

Metode de sortare - pregătire admitere - Conf.dr. Alexandru Popa Lect. dr. Andrei Pătraşcu Universitatea din Bucureşti 1

Lecții de pregă,re la informa,că Admitere 2019 Tema: Discutarea problemelor date la ul,mele sesiuni de admitere Bogdan Alexe

Limbaje de Programare Curs 6 – Functii de intrare-iesire

Calcul Numeric

Microsoft Word - Rezolvarea Test nr. 11.doc

Secţiunea 5-6 avansaţi PROBLEMA 1 Concurs online de informatică Categoria PROGRAMARE 100 puncte NR Un număr natural nenul V care se plictisea singur,

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

Matrici și vectori în VBA În VBA, o matrice este un grup de variabile de același tip. De ce ar trebui să utilizați o matrice? Presupunem că ați vrut s

gaussx.dvi

Structuri de date pentru partiţii de mulţimi O partiţie finită a unei mulţimi nevide S este o mulţime finită de submulţimi ale lui S: {S 1, S 2,..., S

Logică și structuri discrete Limbaje regulate și automate Marius Minea marius/curs/lsd/ 24 noiembrie 2014

Limbaje de Programare Curs 5 – Siruri de caractere

O NOUA PROBLEMA DE CONCURS OLIMPIADA MUNICIPALA DE INFORMATICA, IASI 2019 V-am promis într-un articol mai vechi ca vom prezenta pe acest blog câteva p

Teoria Grafurilor şi Combinatorică recapitulare Principii de numărare Reţineţi că: P (n, r) este numărul de şiruri (sau r-permutări) de forma A 1,...,

PCLPII-C16(9)

Logică și structuri discrete Relații. Funcții parțiale Marius Minea marius/curs/lsd/ 20 octombrie 2014

Slide 1

Algoritmi elementari Metode de căutare secvenţială binară Metode de ordonare metoda bulelor metoda inserţiei metoda selecţiei metoda numărării Intercl

Microsoft Word - O problema cu bits.doc

PROGRAMA CONCURSULUI NAŢIONAL

Tablouri unidimensionale Problema 1 Să se determine mulţimea cifrelor unui număr natural n > 0, dat. Exemplu: n= Cifre = {1,2,3,7} Se cere să s

Clasa IX 1. O lăcustă face salturi, fiecare salt în linie dreaptă şi de două ori mai lung ca precedentul. Poate vreodată lăcusta să revină în punctul

Microsoft PowerPoint - Fp_2.ppt

Declararea variabilelor

Nr. 932 din Avizat ISJ Vâlcea, Inspector școlar informatică, Ciochină Luisa EXAMEN DE ATESTARE A COMPETENȚELOR PROFESIONALE A ABSOLVENȚILOR

Secţiunea 5-6 începători Concurs online de informatică Categoria PROGRAMARE PROBLEMA puncte PERIODIC Se citește un număr natural nenul N. Se ump

GHERCĂ MAGDA CASA CORPULUI DIDACTIC BRĂILA PORTOFOLIU EVALUARE INFORMATICĂ ȘI TIC PENTRU GIMNAZIU CLASA A V-A Neamț SERIA 1 GRUPA 1 CURSANT: GHERCĂ G

Microsoft PowerPoint - ImplementareLimbaj [Read-Only] [Compatibility Mode]

/*

LUCRAREA 8 PROGRAMAREA NELINIARĂ ÎN REZOLVAREA PROBLEMELOR DIN ENERGETICĂ. METODE DE ORDINUL Aspecte generale Programarea neliniară are o foart

Microsoft Word - Raspunsul la niste provocari. Partea III..doc

1. Găsiți k numerele cele mai apropiate într-un şir nesortat Dându-se un şir nesortat și două numere x și k, găsiți k cele mai apropiate valori de x.

Retele Petri si Aplicatii

Logică și structuri discrete Logică propozițională Marius Minea marius/curs/lsd/ 3 noiembrie 2014

1. a. Să se scrie un algoritm care să afişeze toate numerele de patru cifre care au cifra sutelor egală cu o valoare dată k, şi cifra zecilor cu 2 mai

Performanta in matematica de gimnaziu si liceu-program de pregatire al elevilor olimpici MULTIMI. OPERATII CU MULTIMI Partea I+II Cls. a V-a

Laborator Implementarea algoritmului DES - Data Encryption Standard. Exemplu DES Algoritmul DES foloseşte numere b

Slide 1

Slide 1

Curs8

Limbaje de programare Pointeri. Alocare dinamică (continuare) 26 noiembrie 2012

Şiruri de numere reale Facultatea de Hidrotehnică Universitatea Tehnică Gheorghe Asachi Iaşi, 2015 Analiză Matematică Lucian Maticiuc 1 / 29

Analiză de flux de date 29 octombrie 2012

Analiză statică Analiza fluxului de date 23 octombrie 2014

Capitole Speciale de Informatică Curs 1: Extragerea informaţiilor. Modelul boolean şi modelul boolean extins 27 septembrie 2018 Extragerea informaţiil

Microsoft Word - PCLP2_Curs_4_2019.doc

I

Lecţia 2 Structura liniară, alternativă şi repetitivă Clasa a V-a Structuri de bază(liniară, alternativă şi repetitivă) Programarea structurată este o

COMENTARII FAZA JUDEŢEANĂ, 9 MARTIE 2013 Abstract. Personal comments on some of the problems presented at the District Round of the National Mathemati

L7

Divide et Impera

Fâciu N. Maria-Ema CASA CORPULUI DIDACTIC BRĂILA PROGRAM DE FORMARE INFORMATICĂ ȘI TIC PENTRU GIMNAZIU CLASA A V-A SERIA 1 GRUPA 2 CURSANT: Fâciu N. M

I. Partea introductivă Proiectul unității de învățare CONCEPTUL DE MATRICE ŞCOALA: Colegiul Național Petru Rareș Suceava CLASA: a XI a- matematică / a

Grile si probleme siruri de caractere in C++ ŞIRURI DE CARACTERE Itemii următori sunt preluaţi din variantele de bacalaureat În secvenţa de i

Aproximarea functiilor prin metoda celor mai mici patrate

tehnologii web

Propunator: Morar Florin Colegiul National Silvania Zalau Discipina: Informatica Nivel liceal, cls. XI 1.Fişierul text bac.in conţine cel mult 1000 de

Microsoft Word - Software pentru ordonarea multirang a componentelor unei colectivitati.doc

Grafuri - Concepte de baza. Tipuri de grafuri. Modalitati de reprezentare

Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011

Top

Microsoft Word - CarteC.doc

Microsoft Word - TIC5

Analiz¼a Matematic¼a - Curs 6 M¼ad¼alina Roxana Buneci

Prelegerea 3 În această prelegere vom învăţa despre: Clase speciale de latici: complementate. modulare, metrice, distributive şi 3.1 Semi-distributivi

Cursul 12 (plan de curs) Integrale prime 1 Sisteme diferenţiale autonome. Spaţiul fazelor. Fie Ω R n o mulţime deschisă şi f : Ω R n R n o funcţie de

Algebra si Geometri pentru Computer Science

SECURITATE ȘI CRIPTOGRAFIE

Distanţa euclidiană (indusă de norma euclidiană) (în R k ). Introducem în continuare o altă aplicaţie, de această dată pe produsul cartezian R k XR k,

1 Lucrarea nr. 8 - Structuri de date de tip liste sortate O listă sortată reprezintă un aranjament al înregistrărilor din cadrul listei în funcţie de

Curs 8: Tehnica divizării (I) Algoritmi si structuri de date - Curs 8 1

Paradigme de programare

Propunator: Morar Florin Colegiul National Silvania Zalau Discipina: Informatica Nivel liceal, cls. XII 1.Să se scrie în limbajul C/C++ definiţia comp

Logică și structuri discrete Mulțimi Casandra Holotescu

MergedFile

1

Procesarea Imaginilor - Laborator 1: Introducere în utilizarea bibliotecii OpenCV 1 1. Introducere în utilizarea bibliotecii OpenCV 1.1. Introducere S

Microsoft Word - D_ MT1_II_001.doc

LOGICA MATEMATICA SI COMPUTATIONALA Sem. I,

MergedFile

Transcriere:

Facultatea de Matematică și Informatică Lecții de pregătire Admitere 2019 Rezolvarea problemelor folosind metoda backtracking

Exemplu: ieșirea din labirint 2

Exemplu: aranjarea a n regine 3

Exemplu: rezolvarea unui sudoku 4

Agenda Metoda Backtracking: prezentare generală Varianta nerecursivă Varianta recursivă Exemple Generarea permutărilor, aranjamentelor, combinărilor Problema celor n regine Problema colorării hărţilor Şiruri de paranteze ce se închid corect Partiţiile unui număr natural Probleme de backtracking date la admitere 5

Metoda Backtracking Se foloseşte în cazul problemelor a căror soluţie este un vector x = (x 1, x 2,..., x n ) unde fiecare x i apartine unei mulţimi finite A i, elementele mulțimilor A i aflându-se întro relaţie de ordine bine stabilită. Între componentele x i ale vectorului sunt precizate anumite relaţii numite condiţii interne. Mulţimea A = ny i=1 A i se numeşte spaţiul soluţiilor posibile. Soluţiile posibile care satisfac condiţiile interne se numesc soluţii rezultat. Generarea tuturor elementelor produsului cartezian nu este acceptabilă (căutare exhaustivă într-un spaţiu de dimensiuni mari). 6

Metoda Backtracking Dimensiunea spaţiului soluţiilor posibile A 1 A 2... A n are A 1 A 2... A n elemente Metoda backtracking încearcă micşorarea timpului de calcul, realizând o căutare sistematică în spaţiul soluţiilor posibile. Vectorul! este construit progresiv, începând cu prima componentă. Se avansează cu o valoare! " dacă este satisfăcută condiţia de continuare. Condiţiile de continuare rezultă de obicei din condiţiile interne. Ele sunt strict necesare, ideal fiind să fie şi suficiente. 7

Metoda Backtracking Backtracking = parcurgerea limitată (conform condiţiilor de continuare) în adâncime a unui arbore. Spaţiul soluţiilor este organizat ca un arbore un vârf este viabil dacă sunt şanse să se găsească o soluţie explorând subarborele cu rădăcina în acel vârf sunt exploraţi numai subarborii cu rădăcini viabile 8

Backtracking nerecursiv k 1; cât timp k > 0 repetă dacă ( k = n+1 ) atunci am găsit o soluţie prelucrează(x 1,..., x n ); afişează soluţie k k-1; revenire după găsirea soluţiei altfel dacă ( " $ % netestat) atunci x k v; atribuie dacă (x 1,...,x k îndeplineşte cond. continuare) atunci k k+1; avanseazǎ sfârşit dacă altfel k k-1; revenire sfârşit dacă sfârşit cât timp 9

Pentru cazul particular A i =1, 2,,n, " i=1,...,n, algoritmul se rescrie astfel: x i 0, "i=1,...,n k 1; cât timp k > 0 repetă dacă ( k = n+1 ) atunci am găsit o soluţie prelucrează(x 1,..., x n ); afişează soluţie k k-1; revenire după găsirea soluţiei altfel dacă (x k <n) atunci x k x k + 1; atribuie dacă (x 1,...,x k îndeplineşte cond. continuare) atunci k k+1; avanseazǎ sfârşit dacă altfel x k 0; k k-1; revenire sfârşit dacă sfârşit cât timp 10

Backtracking recursiv Descriem varianta recursivă pentru cazul particular A i =1, 2,,n, " i=1,...,n. Apelul iniţial este backrec(1). procedura backrec(k) dacă (k=n+1) atunci am găsit o soluţie prelucrează(x 1,..., x n ); afişează soluţie altfel i 1; cât timp i<=n repetă toate valorile posibile x k i; dacă (x 1,...,x k îndeplineşte cond. continuare) atunci backrec(k+1); sfârşit dacă i i+1; sfârşit cât timp sfârşit dacă sfârşit procedura 11

Exemple 1. Generarea permutărilor, aranjamentelor, combinărilor 2. Problema celor n regine 3. Colorarea hărţilor 4. Şiruri de paranteze ce se închid corect 5. Partiţiile unui număr natural 6. Generarea unor numere cu proprietăţi specificate 7. Generarea produsului cartezian 8. Generarea tuturor soluţiilor unei probleme, pentru a alege dintre acestea o soluţie care minimizează sau maximizează o expresie 12

Generarea permutărilor Se citeşte un număr natural n. Să se genereze toate permutările mulţimii 1, 2,, n. v Reprezentarea soluţiei? v Condiţii interne? v Condiţii de continuare? ü x = (x 1, x 2,, x n ) ü Condiţii interne: pentru orice i¹j, x i ¹x j ü Condiţii de continuare: pentru orice i<k, x i ¹x k 13

Exemplu: n = 3 = 1,2,3 1,2,3 1,2,3 x = (x 1, x 2, x 3 ) 1 2 3 1 2 3 1 2 3 1 2 3 1 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 (1,2,3) (1,3,2) (2,1,3) (2,3,1) (3,1,2) (3,2,1) 14

1 2 3 1 1 2 2 2 2 3 3 1 1 1 1 1 1 1 1 2 3 1 2 3 3 3 1 1 1 1 2 1 1 2 2 2 2 2 2 1 2 3 1 2 3 3 3 3 1 1 1 2 2 2 2 3 3 3 3 3 1 2 3 1 2 2 2 2 3 3 3 3 3 3 3 15

type stiva = array[1..20] of integer; var n,nrsol:integer; procedure tipar(x:stiva); var i:integer; nrsol := nrsol+1; write('solutia ',nrsol,': '); for i:=1 to n do write(x[i],' '); writeln; function cont(x:stiva; k:integer):boolean; var i:integer; cont:=true; for i:=1 to k-1 do if (x[i]=x[k]) then cont:=false; int n, nrsol = 0, x[20]; void tipar(int x[]) nrsol++; printf("solutia %d:", nrsol); for(int i=0; i<n; i++) printf(" %d ", x[i]); printf("\n"); int cont(int x[], int k) for(int i=0;i<k;i++) if (x[i]==x[k]) return 0; return 1; 16

procedure back(); var k,i:integer; for i:=1 to n do x[i]:=0; k:=1; while k>0 do if k=n+1 then tipar(x); k:=k-1; end else if x[k]<n then x[k]:=x[k]+1; if cont(x,k) then k:=k+1; end else x[k]:=0; k:=k-1; void back() int k = 0; for(int i=0; i<n; i++) x[i]=0; while(k > -1) if (k==n) tipar(x); k--; else if(x[k]<n) x[k]++; if (cont(x,k)) k++; else x[k]=0; k--; 17

procedure backrec(k:integer); var i:integer; if k=n+1 then tipar(x) else for i:=1 to n do x[k]:=i; if cont(x,k) then backrec(k+1); end BEGIN write('dati n: '); readln(n); nrsol := 0; back(); sau backrec(1); readkey; END. void backrec(int k) if(k==n) tipar(x); else for(int i=1;i<=n ;i++) x[k]=i; if (cont(x,k)) backrec(k+1); int main() printf("dati n:"); scanf("%d",&n); back(); // sau // backrec(0); return 0; 18

Problema celor n regine Fiind dată o tablă de şah de dimensiune n x n, se cer toate soluţiile de aranjare a n regine astfel încât să nu atace (să nu se afle două regine pe aceeaşi linie, coloană sau diagonală). 1 2 3 4 1 2 3 4 v Reprezentarea soluţiei? v Condiţii interne? v Condiţii de continuare? 1 2 3 4 1 2 3 4 ü x = (x 1, x 2,, x n ), x k = coloana pe care este plasatǎ regina de pe linia k ü Condiţii interne: pentru orice i¹j, x i ¹x j și x i -x j ¹ j-i. ü Condiţii de continuare: pentru orice i<k, x i ¹x k și x i -x k ¹k-i. 19

Problema celor n regine Algoritmul este acelaşi ca la permutări, se modifică doar condiţiile de continuare function cont(x:stiva; k:integer):boolean; var i:integer; cont:=true; for i:=1 to k-1 do if (x[i]=x[k]) or (abs(x[k]-x[i])=abs(k-i)) then cont:=false; int cont(int x[], int k) for(int i=0;i<k;i++) if ((x[i]==x[k]) (abs(x[k]-x[i])== k-i)) return 0; return 1; 20

Generarea aranjamentelor Se citesc două numere naturale n şi p. Să se genereze toate submulţimile mulţimii 1,2,..., n de p elemente. Două mulţimi cu aceleaşi elemente, la care ordinea acestora diferă, sunt considerate diferite. v Reprezentarea soluţiei? v Condiţii interne? v Condiţii de continuare? ü x = (x 1, x 2,, x p ) ü ü Condiţii interne: pentru orice i¹j, x i ¹x j Condiţii de continuare: pentru orice i<k, x i ¹x k n=3, p=2 1 2 1 3 2 1 2 3 3 1 3 2 21

Algoritmul este acelaşi ca la permutări, se modifică doar dimensiunea stivei procedure tipar(x:stiva); var i:integer; nrsol := nrsol+1; write('solutia ',nrsol,': '); for i:=1 to p do write(x[i],' '); writeln; procedure back(); var k,i:integer; for i:=1 to p do x[i]:=0; k:=1; while k>0 do if k=p+1 then void tipar(int x[]) nrsol++; printf("solutia %d:", nrsol); for(int i=0; i<p; i++) printf(" %d ", x[i]); printf("\n"); void back() int k = 0; for(int i=0; i<p; i++) x[i]=0; while(k > -1) if (k==p) tipar(x); k--; else 22

Generarea combinărilor Se citesc două numere naturale n şi p, n p. Să se genereze toate submulţimile mulţimii 1,2,..., n având p elemente. Două mulţimi cu aceleaşi elemente, la care ordinea acestora diferă, sunt considerate egale. v Reprezentarea soluţiei? v Condiţii interne? v Condiţii de continuare? ü x = (x 1, x 2,, x p ) ü ü Condiţii interne: pentru orice i<j, x i <x j n=4, p=3 1 2 3 1 2 4 1 3 4 2 3 4 Condiţii de continuare: pentru orice k>1, x k-1 <x k 23

Algoritmul este acelaşi ca la aranjamente, se modifică în plus funcţia de continuare function cont(x:stiva; k:integer):boolean; var i:integer; cont:=true; if k>1 then if x[k]<=x[k-1] then cont:=false; procedure back(); var k,i:integer; for i:=1 to p do x[i]:=0; k:=1; while k>0 do if k=p+1 then int cont(int x[], int k) if (k>0) if (x[k] <= x[k-1]) return 0; return 1; void back() int k = 0; for(int i=0; i<p; i++) x[i]=0; while(k > -1) if (k==p) tipar(x); k--; else 24

Întrebare Este importantă evitarea situaţiei în care se tipăreşte de două ori o mulţime, din cauză că este scrisă în altă ordine: 1,2,4 vs. 1,4,2. Ce valori poate să ia elementul de pe nivelul k al stivei? a) între 1 si n b) între k si p c) între k si n-p+k d) între x[k-1]+1 si n-p+k 25

Colorarea hǎrţilor Se consideră o hartă. Se cere colorarea ei folosind cel mult 4 culori, astfel încât oricare două ţări vecine să fie colorate diferit. v Reprezentarea soluţiei? v Condiţii interne? v Condiţii de continuare? Problema matematică: orice hartă poate fi colorată utilizând cel mult 4 culori (rezultat demonstrat în 1976 de către Appel and Haken unul dintre primele rezultate obţinute folosind tehnica demonstrării asistate de calculator) 26

Colorarea hǎrţilor Reprezentarea soluţiei: x = (x 1, x 2,, x n ), unde x k = culoarea curentă cu care este coloratǎ ţara k, x k Î 1,2,3,4. Condițiile interne: x i ¹ x j pentru orice două țări vecine i și j. Condiții de continuare: x i ¹ x k pentru orice țară iî1,2,,k-1 vecină cu ţara k. Folosim o matrice a pentru a memora relaţia de vecinătate dintre ţări: 1, dacă i şi j sunt ţări vecine! "# = % 0, dacă i şi j nu sunt ţări vecine a ij = 1, dacă țările i și j sunt vecine 0, altfel 27

function cont(x:vector; k:integer):boolean; var i:integer; cont:=true; for i:=1 to k do if((x[i]=x[k]) and a[k,i]=1)) then cont:=false; procedure backrec(k:integer); var i:integer; if k=n+1 then tipar(x) else for i:=1 to 4 do x[k]:=i; if cont(x,k) then backrec(k+1); end int cont(int x[], int k) for(int i=0;i<k;i++) if ((x[i]==x[k]) && (a[k][i]==1)) return 0; return 1; void backrec(int k) if(k==n) tipar(x); else for(int i=1;i<=4 ;i++) x[k]=i; if (cont(x,k)) backrec(k+1); 28

Generarea şirurilor de n paranteze ce se închid corect Se citeşte de la tastatură un număr natural n, n 30. Să se genereze şi să se afişeze pe ecran toate combinaţiile de n paranteze rotunde care se închid corect. De exemplu, pentru n = 4 se obţin următoarele combinaţii: (( )), ( )( ) Pentru n = 6 se obţin combinaţiile: ((( ))), (()()), ( )( )( ), ( )(( )), (( ))( ) 29

Există soluţii Û n este par. Reprezentarea soluţiei: x = (x 1, x 2,, x n ), unde x k Î '(', ')' Notăm dif = nr ( - nr ) la pasul k Condiţii interne (finale) dif = 0 dif 0 pentru orice secvenţă x 1, x 2,, x k Condiţii de continuare dif 0 doar necesar dif n k şi suficient Observaţie. În implementarea următoare backtracking-ul este optimal: se avansează dacă şi numai dacă suntem siguri că vom obţine cel puţin o soluţie. Cu alte cuvinte, condiţiile de continuare nu sunt numai necesare, dar şi suficiente. 30

procedure backrec(k:integer); if(k=n+1) then tipar(x) else x[k]:='('; dif:=dif+1; if(dif <= n-k+1) then backrec(k+1); dif:=dif-1; x[k]:=')'; dif:=dif-1; if(dif >= 0) then backrec(k+1); dif:=dif+1; if(n mod 2=0) then dif:=0; backrec(1); void backrec(int k) if(k==n) tipar(x); else x[k]='( ; dif++; if (dif <= n-k) backrec(k+1); dif--; x[k]=') ; dif--; if (dif >= 0) backrec(k+1); dif++; if (n%2==0) dif=0; backrec(0); 31

Partiţiile unui număr natural Dat un număr natural n, să se genereze toate partițiile lui n ca sumă de numere pozitive (x 1, x 2,, x k Î 1,2,,n cu proprietatea x 1 + x 2 + + x k = n). De exemplu, pentru n = 4, partițiile sunt 1+1+1+1, 1+1+2, 1+3, 2+2, 4 Pentru n = 6, partițiile sunt 1+1+1+1+1+1, 1+1+1+1+2, 1+1+1+3, 1+1+2+2, 1+1+4, 1+2+3, 1+5, 2+2+2, 2+4, 3+3, 6 32

Reprezentarea soluţiei: x = (x 1, x 2,, x k ) (stivă de lungime variabilă!), unde x i Î 1,2,,n Condiţii interne (finale) x 1 + x 2 + + x k = n pentru unicitate: x 1 x 2 x k Condiţii de continuare x k-1 x k (avem x k Î x k-1,,n) x 1 + x 2 +... + x k n 33

k:=1; s:=0; while(k>=1) do if(x[k]<n) then x[k]:=x[k]+1; s:=s+1; if (s<=n) then if(s=n) then tipar(x,k); s:=s-x[k]; k:=k-1; end else k:=k+1; x[k]:=x[k-1]-1; s:=s+x[k]; end else s:=s-x[k]; k:=k-1; void back() int k=0, s=0; while(k>=0) if(x[k]<n) x[k]++; s++; if(s<=n) //cond.cont. if(s==n) // solutie tipar(x,k); s=s-x[k]; k--; //revenire else //avansare k++; x[k]=x[k-1]-1; s+=x[k]; else //revenire s=s-x[k]; k--; 34

Probleme date la admitere care se pot rezolva cu metoda backtracking 1. Generarea unor numere cu proprietăţi specificate 2. Generarea produsului cartezian 3. Generarea tuturor soluţiilor unei probleme, pentru a alege dintre acestea o soluţie care minimizează sau maximizează o expresie 35

Problemă (admitere 2012) Utilizând metoda backtracking se generează toate numerele cu câte trei cifre impare, cifre care aparţin mulţimii 7,8,1,6,2,3. Primele 4 soluţii generate sunt, în această ordine: 777, 771, 773, 717. Cea de a 8-a soluţie generată este: a) 737 b) 788 c) 717 d) 731 7,8,1,6,2,3 Solutia 1: 777 Solutia 2: 771 Solutia 3: 773 Solutia 4: 717 7,8,1,6,2,3 Solutia 5: 711 Solutia 6: 713 Solutia 7: 737 Solutia 8: 731 36

Algoritmul este asemănator cu cel de la aranjamente var cif: array[1..6] of integer = (7,8,1,6,2,3); procedure tipar(x:stiva); var i:integer; nrsol := nrsol+1; write('sol. ',nrsol,': '); for i:=1 to p do write(cif[x[i]],' '); writeln; function cont(x:stiva; k:integer):boolean; cont:=true; if cif[x[k]] mod 2 = 0 then cont:=false; int n=6, p=3, nrsol = 0, x[3]; int cif[]=7,8,1,6,2,3; void tipar(int x[]) nrsol++; printf("sol. %d:", nrsol); for(int i=0; i<p; i++) printf("%d", cif[x[i]-1]); printf("\n"); int cont(int x[], int k) if (cif[x[k]-1]%2==0) return 0; return 1; 37

Problemă (admitere 2006) Reformulare. Se dau vectorii! = # $, # &,, # ( şi ) = * $, * &,, * ( cu proprietatea # + * +,. = 1.. 1. Să se genereze toţi vectorii 2 = 3 $, 3 &,, 3 ( cu proprietatea # + 3 + * +,. = 1.. 1. 38

a:array[1..4] of integer=(1,8,1,1); b:array[1..4] of integer=(2,9,2,9); procedure back(); var k,i:integer; for i:=1 to n do x[i]:=a[i]-1; k:=1; while k>0 do if k=n+1 then tipar(x); k:=k-1; end else if x[k]<b[k] then x[k]:=x[k]+1; k:=k+1; end else x[k]:=a[k]-1; k:=k-1; int n=4, nrsol = 0, x[4]; int a[]=1,8,1,1, b[]=2,9,2,9; void back() int k = 0; for(int i=0; i<n; i++) x[i]=a[i]-1; while(k > -1) if (k==n) tipar(x); k--; else if (x[k]<b[k]) x[k]++; k++; else x[k]=a[k]-1; k--; 39

procedure backrec(k:integer); var i:integer; if k=n+1 then tipar(x) else for i:=a[k] to b[k] do x[k]:=i; backrec(k+1); end void backrec(int k) if(k==n) tipar(x); else for(int i=a[k];i<=b[k];i++) x[k]=i; backrec(k+1); Numărul vectorilor cu proprietatea cerută este ny (b[i] a[i] + 1) i=1 40

Problemă (admitere 2011, enunţ modificat) Se dă un vector v de n elemente egale cu 1. Prin partiţie a vectorului v înţelegem o împărţire a vectorului în subvectori, astfel încât fiecare element al vectorului v apare exact o dată într-unul dintre subvectori. Pentru fiecare partitie a vectorului v în p subvectori! "",,! "%&,! '",,! '%(,,! )",,! )%*, se calculează produsul sumelor elementelor din fiecare subvector al ) partiţiei, adică,-".,. a) Să se citească n, p de la tastatură şi să se scrie un program care determină cel mai mare produs calculat în acest fel pentru toate partiţiile în p subvectori ale vectorului v. b) Există o soluţie la punctul a) care să nu calculeze toate produsele posibile? Justificaţi. 41

Întrebare Se dau n = 11, p=3. Care este cel mai mare produs % &" pentru toate partiţiile în p subvectori ale "#$ vectorului v? a) 21 b) 30 c) 48 d) 64 Observaţie: n 1 + n 2 + + n p = n. 42

Exemplu n = 11, p = 3: n 1 + n 2 + n 3 = 11 [ [1,1,1], [1,1,1,1], [1,1,1,1] ] n 1 =3, n 2 = 4, n 3 = 4, n 1 n 2 n 3 = 48 n 1 n 2 n 3 Produs 1 1 9 9 1 2 8 16 1 3 7 21 3 3 5 45 3 4 4 48 43

var n,p,nrsol,prod_max:integer; nrsol := 0; prod_max := 0; procedure tipar(x:stiva); var i,prod:integer; prod := 1; nrsol := nrsol+1; write('solutia ',nrsol,': '); for i:=1 to p do write(x[i],' '); prod:=prod*x[i]; write(' are produsul ',prod); writeln; if prod > prod_max then prod_max := prod; int n, p, nrsol = 0, x[20], prod_max=0; void tipar(int x[]) int prod = 1; nrsol++; printf("sol %d: ", nrsol); for(int i=0; i<p; i++) printf("%d ", x[i]); prod = prod*x[i]; printf(" are produsul %d \n", prod); if (prod > prod_max) prod_max = prod; 44

function cont(x:stiva; k:integer):boolean; var s,i:integer; s := 0; cont:=true; if k>1 then if x[k]<x[k-1] then cont:=false; for i:=1 to k do s:=s+x[i]; if s>n then cont:=false; function solutie(x:stiva; k:integer):boolean; var s,i:integer; s := 0; solutie:=true; if k<>p+1 then solutie := false; for i:=1 to p do s := s + x[i]; if s <> n then solutie:=false; int cont(int x[], int k) int s = 0; if (k>0) if (x[k] < x[k-1]) return 0; for (int i=0; i<=k; i++) s = s + x[i]; return (s<=n); int solutie(int x[], int k) int s = 0; if (k!=p) return false; for (int i=0; i<p; i++) s = s + x[i]; return (s==n); 45

procedure back(); var k,i:integer; for i:=1 to p do x[i]:=0; k:=1; while k>0 do if solutie(x,k) then tipar(x); k:=k-1; end else if x[k]<n then x[k]:=x[k]+1; if cont(x,k) then k:=k+1; end else x[k]:=0; k:=k-1; void back() int k = 0; for(int i=0; i<p; i++) x[i]=0; while(k > -1) if (solutie(x,k)) tipar(x); k--; else if(x[k]<n) x[k]++; if (cont(x,k)) k++; else x[k]=0; k--; 46

Există o soluţie la punctul a) care să nu calculeze toate produsele posibile? Justificaţi! Pentru n şi p daţi notăm cu c, r câtul şi restul împărţirii lui n la p. Elementele ce vor maximiza produsul sunt: c, c,, c, c+1,, c+1 de p-r ori de r ori!"#$%&' = ) *+, () + 1), 47

Întrebare Se dau n = 26, p=4. Care este cel mai mare produs % &" pentru toate partiţiile în p subvectori ale "#$ vectorului v? a) 1375 b) 1820 c) 1764 d) 1728 48

Exerciţii propuse 1. Generarea tuturor submulţimilor mulţimii 1,2,..., n. 2. Generarea submulţimilor unei mulţimi cu elemente arbitrare a 1,a 2,..., a n. 3. Generarea partiţiilor unei mulţimi. 4. Se dă o sumă s şi n tipuri de monede având valorile a 1, a 2,, a n lei. Se cer toate modalităţile de plată a sumei s utilizând tipurile de monede date. 5. Să se determine numerele A de n cifre,! = # $ # % # ' cu # ( 1,2, - = 1.. /, care sa fie divizibile cu 2 n. 49

Vă mulţumesc! Succes la examenul de admitere! 50