Documente Academic
Documente Profesional
Documente Cultură
nimi , 0 ni R
sortat=0;
}
}
while (!sortat);
}
void afisare(int* sol, int* b, int n)
{
int i;
for (i=0;i n;i++)
if (sol[i]
)
printf(%d bancnote de %d lei\n, sol[i], b[i]);
}
void main( )
{
int n, s, I, *sol, *b;
printf (Numarul de tipuri de bancnote:);
scanf (%d,&n);
b=(int*)malloc(n*sizeof(int));
sol=(int*)malloc(n*sizeof(int));
for (i=0;i
;i++)
{
printf (tip[%d]=, i);
scanf (%d, &b[i]);
}
printf (Suma care trebuie platita:);
scanf (%d, &s);
ordonare (b,n);
for (i=0; i n;i++)
{
sol[i]=s/b[i];
s-=sol[i]*b[i];
}
if (s>o)
printf (Suma nu s-a putut plati!!!);
else
afisare (sol, b, n);
free (b);
free(sol);
}
max=-INT_MAX;
k=0;
for(i=1;i<=n;i++)
if (a[i]>0)
s[++k]=a[i];
else
if(a[i]>max)
max=a[i];
if(k==0)
s[++k]=max;
printf("Elementele care formeaza suma maxima:");
for(i=1;i<=k;i++)
printf("%d",s[i]);
printf("\n");
{
return x<=y ? x:y;
}
int minim(int a[20], int p, int q)
{
int m;
if (q-p<=1)//daca sirul are 1 sau 2 elemente
return min(a[p],a[q]);
m=(p+q)/2;
return min(minim(a,p,m),minim(a,m+1,q));
}
void main()
{
int n,i,a[20];
printf("n=");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
printf("Minimul din sir este: %d\n",minim(a, 1, n));
}
a, daca n=1
an=
}
}
void main()
{
double a;
int n;
printf("a=");
scanf("%1f",&a);
printf("n=");
scanf("%d",&n);
printf("Calculul puterii:%10.21f\n",putere(a,n));
Metoda Backtracking
1.Colorarea hartilor
Fiind data o harta cu n tari, se cere sa se genereze toate solutiile de colorare a hartii cu m
culori astfel incat pentru fiecare tara sa se foloseasca o singura culoare si doua tari
vecine(cu frontier comuna) sa fie colorate diferit.
Configuratia hartii este furnizata cu ajutorul unei matrice H=(hij)nn
1, daca tara I este vecina cu tara j
hij=
0, in caz contrar
Fie C={c1, . . . ,cm}={1, . . . ,m} multimea celor m culori si T={1, . . . ,n} multimea celor n tari.
Elementele problemei sunt urmatoarele:
Sk=C, k=1, . . . ,n
O solutie posibila este de forma s=(s1, . . . ,sn), skC, k=1, . . .,n;
Restrictiile interne sunt: si sj daca hij=1, i=1, . . . ,n, j=1, . . . ,n;
Conditiile de continuare sunt: si sk pentru orice tara I din {1, . . . ,k-1 }T, vecina cu
tara k.
k=1;
s[1]=0;
while(k>0)
{
while(s[k]<m)
{
s[k]++;
if(cont(s,k,h))
if(k==n)
afisare(s,n);
else s[++k]=0;
}
k--;
}
}
void main()
{
int n, m, h[20][20], i, j;
printf("Numarul de tari:");
scanf("%d",&n);
printf("Numarul de culori:");
scanf("%d",&m);
//citire matrice de adiacenta a tarilor
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j)
{
printf("h[&d][&d]=", i, j)
scanf("&d",&h[i][j]);
}
back(n,m,h);
}
2. Problema permutarilor
Sa se afiseze toate permutarile de cate n elemente. De exemplu, pentru n=3 acestea sunt
1,2,3; 1,3,2; 2,1,3; 2,3,1; 3,1,2; 3,2,1.
Codul sursa al programului este:
#include <stdio.h>
void afisare(int s[20], int n)
{
int i;
for(i=1;i<=n;i++)
printf("%d",s[i]);
printf("\n");
}
int cont(int s[20], int k)
{
int i;
for(i=1;i<k;i++)
if(s[i]==s[k])
return 0;
return 1;
}
void back(int n)
{
int k, s[20];
k=1;
s[1]=0;
while(K>0)
{
while(s[k]<n);
{
s[k]++;
if(cont(s,k))
if(k==n)
afisare(s,n);
else
s[++k]=0;
}
k--;
}
}
void main()
{
int n;
printf("N=");
scanf("%d",&n);
back n;
}