Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
1. Scopul lucrării
În această lucrare se vor prezenta metoda de elaborare a algoritmilor.
3. Metoda Greedy
#include <stdio.h>
int main() {
int n, p[200], rez[200], k, M, i, j, sum, temp, x;
printf("introduceti n: "); scanf("%d", &n);
for (i=0; i<n; i++) {
printf("p[%d]=", i); scanf("%d", &p[i]);
}
printf("Introduceti suma: "); scanf("%d", &M);
/* incepem abordarea greedy a problemei */
/* ordonam crescator multimea de numere p */
for (i=0; i<n1; i++)
for (j=i+1; j<n; j++)
if (p[i]>p[j]) { temp = p[i]; p[i] = p[j]; p[j] = temp; };
k = 0; sum = 0;
for (i=0; i<n; i++) {
x = p[i]; /* alege(A,i,x) */
if ( sum + x <= M ) {
rez[k++] = x;
sum += x;
}
else break;
}
printf("submultimea rezultat: ");
for (i=0; i<k; i++) printf(" %d", rez[i]);
printf("\n");
4. Metoda BackTracking
Procedure Backtracking(n:integer)
Var v,k:integer
Begin procedure
k ← 1;
while (k > 0)
v ← 0;
while (mai exista o valoare t∈Sk netestata and (v==0))
xk ← t;
if Φ(x1,x2,…,xk) then v ← 1;
endif
endwhile
if (v==0) then k ← k-1;
else if (k==n) then afiseaza(x1,x2,…,xn)
else k ← k+1
endif
endif
endwhile
end
Figura 1. Pseudocod pentru varianta nerecursivă de backtracking
4.2. Exemple
Program C:
#include <stdio.h>
#include <math.h>
int main() {
int n,i,k,v;
int x[20]; /* x[i] va reprezenta coloana pe care se afla dama de pe linia i */
Program C:
#include <stdio.h>
int t,r,p ;
x[i][j] = k;
if (k==n*n) {
printf("\n");
for (t=0;t<n;t++) {
for (r=0;r<n;r++) printf("%3d",x[t][r]);
printf("\n");
}
} else
for (t=0;t<8;t++) {
r = i+a[t]; p = j+b[t];
if ( (r>=0) && (r<n) &&
(p>=0) && (p<n) &&
(x[r][p] == 0) )
aseaza(k+1,r,p);
}
x[i][j] = 0; /* reface pozitia alterata */
}
int main() {
int i,j;
printf("introduceti n:"); scanf("%d",&n);
for (i=0;i<n;i++)
for (j=0;j<n;j++)
aseaza(1,i,j);
return 0;
}
Exemplu: determinarea drumurilor cele mai scurte într-un graf. Fie un graf orientat cu n
vârfuri, reprezentat prin matricea de adiacentă. Astfel, în matricea de adiacentă elementul
de pe poziţia (i,j) indică lungimea drumului direct de la nodul i la nodul j. Dacă în graf nu
există arc de la i la j atunci elementul (i, j) este nul. Se cere să se determine lungimea
drumului minim de la i la j.