Documente Academic
Documente Profesional
Documente Cultură
2014
BACKTRACKING. PROBLEME
2014
15. PROBLEMA COLORRII HARILOR. Find dat o hart cu N ri, se cer toate
soluiile de colorare a hrii utiliznd maxim 4 culori, astfel nct oricare dintre
dou ri cu frontier comun s fie colorate cu culori diferite.
16. PROBLEMA COMIS-VOIAJORULUI. Un comis-voiajor trebuie s viziteze un
numr de N orae. Iniial acesta se afl ntr-unul din ele notat 1. Comis-voiajorul
dorete s nu treac de dou ori prin acelai ora iar la ntoarcere s revin n
oraul 1. Cunoscnd legturile dintre orae, se cere s se tipreasc toate
drumurile poibile pe care le poate efectua comis-voiajorul.
17. PROBLEMA PLII unei sume S utiliznd N tipuri de monede. Se dau: suma S i
N tipuri de monede avnd valorile: a1, a2, .., an lei. Se cer toate modalitile de
plat exact a sumei S utiliznd aceste monede.
18. PARTIIILE UNUI NUMR NATURAL. Se citete un numr natural N. Se cere s
se tipreasc toate modurile de descompunere a sa ca sum de numere naturale
(Exemplu: pentru numrul 4: 1111, 112, 121, 13, 211, ).
19. DESCOMPUNERE. S se decompun un numr natural N n toate modurile
posibile ca sum de p numere naturale distincte. (p<=N).
20. DESCOMPUNERE CA SUMA DE NUMERE PRIME. Fiind dat un numr natural
N, se cere s se afieze toate descompunerile numrului respectiv ca sum de
numere prime.
21. DELEGAII. Dintr-un grup de N persoane, dintre care p femei, trebuie format o
delegaie de K persoane, din care L femei. S se precizeze toate delegaiile care
se pot forma.
22. ARANJAMENTE DE LITERE. Se citesc de la tastatur dou numere naturale N
i P. (0<N<P<12). S se afieze toate irurile de P litere distincte, litere alese
dintre primele N litere mari ale alfabetului englez. De exemplu pentru N=4 i P=2:
AB, AC, AD, BA, BC, BD, CA, CB, CD, DA, DB, DC.
23. DESCOMPUNERE N NUMERE CONSECUTIVE. Se d un numr natural N > 5 .
S se afieze toate descompunerile lui N ca sum de numere naturale
consecutive.
24. COTROCENI. La palatul COTROCENI se ine o conferin de pres la care
trebue s ia cuvntul 5 purttori de cuvnt numii A, B, C, D, E. Afiai toate
modurile de nscriere la cuvnt astfel nct persoana A s vorbeasc mai trziu
dect persoana D i persoana E s fie printre primele trei persoane care vorbesc.
25. SUBMULIMI DE SUMA S. S se genereze toate submulimile de cte M
elemente ale unei mulimi de N elemente pentru care suma elementelor s nu
depeasc o valoare maxim Smax.
26. EXAMEN. S se elaboreze toate modalitile de a promova un examen care
conine N probe, tiind c la fiecare prob (i) se poate obine un punctaj ntre 1 i
(P[i]) iar pentru a fi promovat, un candidat trebuie s obin mcar M puncte.
27. SIR FR NUMERE CONSECUTIVE. S se alctuiasc toate irurile posibile de
cte N (0<N<=9) numere naturale distincte alese din primele N numere naturale
fr 0 (1, 2, .., N) astfel nct s nu existe dou numere consecutive aezate
alturi. Dou numere x i y sunt considerate consecutive dac x = y + 1 sau y = x
+ 1.
28. MATRICE PATRATIC BINAR. SIMETRIC. S se genereze toate matricile
ptratice de dimensiune N, formate doar cu elemente 0 i 1, simetrice fa de
diagonala principal i cu diagonala principal 0.
2014
2014
43. Daca se utilizeaza metoda Backtracking pentru a genera in ordine strict crescatoare toate numerele
naturale formate din 4 cifre pare distincte, care dintre numerele de mai jos trebuie eliminate astfel
incat cele ramase sa reprezinte o succesiune de numere corect generata?
1) 2068 2) 2084 3) 2088 4) 2468 5) 2086 6) 2406
44. Se utilizeaza metoda Bachtracking pentru a genera in ordine crescatoare toate numerele naturale
de 5 cifre distincte care se pot forma cu cifrele 0, 1, 2, 3 si 4. Sa se precizeze numarul generat
imediat inaintea si numarul generat imediat dupa secventa urmatoare: 12034, 12043, 12304,
12340.
45. S se genereze toate irurile de n (n<=6) note muzicale din mulimea {do, re, mi, fa, sol,
la, si}. Fiecare ir va fi afiat pe cte o linie n fiierul out.txt, notele n cadrul liniei fiind
separate prin cte un spaiu. Acestea se pot repeta n cadrul unui ir.
46. PARTIIILE UNUI NUMR NATURAL. Se citete un numr natural N. Se cere s
se tipreasc toate modurile de descompunere a sa ca sum de numere naturale
(Exemplu: pentru numrul 4: 1111, 112, 121, 13, 211, ).
47. DESCOMPUNERE. S se decompun un numr natural N n toate modurile
posibile ca sum de p numere naturale distincte. (p<=N).
48. DESCOMPUNERE CA SUMA DE NUMERE PRIME. Fiind dat un numr natural
N, se cere s se afieze toate descompunerile numrului respectiv ca sum de
numere prime.
49. S se genereze N vectori de lungime P cu elemente 1 i 2 cu proprietatea c suma
elementelor este egal cu un S dat.
2014
2014
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
cout << "P="; cin >> P;
Aranjamente_Back ();
}
3. COMBINRI. Se citesc dou numere naturale N i P (P<=N). S se genereze toate submulimile mulimii
{1, 2, , N} de P elemente. Dou submulimi se consider egale, dac i numai dac au aceleai
elemente, indiferent de ordinea n care acestea apar.
int N, P, V[10];
int Solutie (int k)
{
return (k==P);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
if (V[k-1]>V[k])
return 0;
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Combinari_Back ()
{
for (int k=0; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
cout << "P="; cin >> P;
2014
Combinari_Back ();
}
4. PERMUTARI GENERALE. Se citete N natural. Se citesc N numere ntregi. S se genereze permutrile
mulimii formate din numerele citite.
int N, V[10], T[10];
void Citeste ()
{
for (int i=1; i<=N; i++)
{
cout << "numarul " << i << " ";
cin >> T[i];
}
}
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout<< setw(4) << T[V[j]]<< " ";
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Permutari_generale ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
Citeste();
Permutari_generale ();
}
5. PERMUTRI DE CUVINTE. Se citete N natural. Se citesc N cuvinte. S se genereze permutrile
mulimii formate din cuvintele citite.
typedef char cuvant[20];
int N, V[10];
cuvant T[10];
void Citeste ()
{
for (int i=1; i<=N; i++)
{
cout << "cuvantul " << i << " ";
cin >> T[i];
}
}
2014
2014
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
Dame_Back ();
}
7. PRODUS CARTEZIAN. Se citete N natural. S se genereze produsul cartezian {1, 2, , N} X {1, 2, ,
N} X {1, 2, , N}.
int A[100],n;
int solutie(int k)
{
return(k==n);
}
void tipar(int k)
{
cout<<endl;
for(int i=1;i<=k;i++)
cout<<A[i]<<" ";
}
void back()
{
for(int k=1;k<=n;k++)
A[k]=0;
k=1;
while(k>0)
{
while(A[k]<n)
{
A[k]++;
if(solutie(k))
tipar(k);
else
k++;
}
A[k--]=0;
}
}
void main()
{
cout<<"n="; cin>>n;
back();
}
8. PRODUS CARTEZIAN a N mulimi cu cte M elemente. Se citete N natural. Se citesc N mulimi: A1, A2,
, AN, fiecare coninnd cte M elemente (elementele unei mulimi sunt distincte). S se genereze
produsul cartezian A1 X A2 X AN.
int A[100],V[10][10],n, m;
void citire()
{
int i,j;
fstream F("b08.txt",ios::in);
F>>n>>m;
2014
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
F>>V[i][j];
F.close();
for(i=1;i<=n;i++)
{
cout<<endl;
for(j=1;j<=m;j++)
cout<<V[i][j]<<" ";
}
}
int solutie(int k)
{
return(k==n);
}
void tipar(int k)
{
cout<<endl;
for(int i=1;i<=k;i++)
cout<<V[i][A[i]]<<" ";
}
void back()
{
for(int k=1;k<=n;k++)
A[k]=0;
k=1;
while(k>0)
{
while(A[k]< m)
{
A[k]++;
if(solutie(k))
tipar(k);
else
k++;
}
A[k--]=0;
}
}
void main()
{
citire();
back();
}
9. PRODUS CARTEZIAN GENERAL. Se citete N natural. Se citesc N mulimi: A1, A2, , AN, coninnd
k1, k2, kN elemente (elementele unei mulimi sunt distincte). S se genereze produsul cartezian A1 X A2
X AN.
int A[100],V[10][10],n, m, T[10];
void citire()
{
int i,j;
fstream F("b09.txt",ios::in);
F>>n;
for(i=1;i<=n;i++)
{
F>>T[i];
for(j=1;j<=T[i];j++)
F>>V[i][j];
}
F.close();
for(i=1;i<=n;i++)
{
cout<<endl;
for(j=1;j<=m;j++)
cout<<V[i][j]<<" ";
}
10
2014
}
int solutie(int k)
{
return(k==n);
}
void tipar(int k)
{
fstream F ("b09.txt", ios::app);
F<<endl;
for(int i=1;i<=k;i++)
F<<V[i][A[i]]<<" ";
F.close();
}
void back()
{
for(int k=1;k<=n;k++)
A[k]=0;
k=1;
while(k>0)
{
while(A[k]<T[k])
{
A[k]++;
if(solutie(k))
tipar(k);
else
k++;
}
A[k--]=0;
}
}
void main()
{
citire();back();
}
10. SIR DE 0 SI 1. S se genereze toate irurile de numere de lungime N formate doar din elemente 0 i 1.
int N, V[10];
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
void Sir_Back ()
{
for (int k=1; k<=N; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<1)
{
V[k] ++;
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=-1;
}
}
void main (void)
11
2014
{
cout << "N="; cin >> N;
Sir_Back ();
}
12
2014
11. DRAPELE TRICOLORE. Avem la dispoziie 6 culori: alb, galben, rou, verde, albastru, negru. S se
precizez toate drapelele tricolore care se pot proiecta, tind c trebuie respectate urmtoarele reguli:
(Regula 1:) orice drapel are culoarea din mijloc galben sau verde, (Regula 2: ) cele trei culori de pe drapel
sunt distincte.
typedef char culoare[10];
culoare C[7];
int V[10];
void Incarca_Culori ()
{
strcpy (C[1], "galben");
strcpy (C[2], "rosu");
strcpy (C[3], "verde");
strcpy (C[4], "albastru");
strcpy (C[5], "alb");
strcpy (C[6], "negru");
}
int Solutie (int k)
{
return (k==3);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << setw(10)<<C[V[j]]<< " ";
}
int Valid (int k)
{
if (k==2)
if ( (V[k]!=3)&&(V[k]!=1))
return 0;
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Drapel_Back ()
{
for (int k=1; k<=6; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<6)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
Incarca_Culori();
Drapel_Back ();
}
12. PARANTEZE. Se d un numr natural N par. S se determine toate irurile de N paranteze care se
nchid corect. Exemplu: N =6 ((( ))), (( )( )), ( )( )( ), ( )(( )), (( ))( )
int N, V[10];
int Solutie (int k)
{
for (int s=0, d=0, i=1; i<=k; i++)
(V[i]==1) ? (s++) : (d++);
13
2014
14
2014
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<1)
{
V[k] ++;
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=-1;
}
}
void main (void)
{
Citeste();
Submultimi_Back ();
}
14. PARTIIILE UNEI MULIMI. Se consider mulimea {1, 2, , N}. Se cer toate partiiile acestei mulimi.
Submulimile A1, A2, , Ak constituie o partiie a mulimii A dac sunt disjuncte ntre ele i reuniunea lor
este mulimea A.
int N, V[10], T[10];
void Citeste ()
{
cout << "NR ELEMENTE: ";
cin >> N;
for (int i=1; i<= N; i++)
{
cout << "ELEMENT " << i << " : ";
cin >> T[i];
}
}
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int max = V[1], i=2; i<=k; i++)
if (max < V[i])
max = V[i];
for (i=1 ; i<= max ; i++)
{
cout << "{ ";
for (int j=1;j<=k; j++)
if (V[j]==i)
cout << T[j]<< " ";
cout << "}";
if (i!=max)
cout << " U ";
}
}
int Valid (int k)
{
for (int max = V[1], i=2; i<k; i++)
if (max < V[i])
max = V[i];
return (V[k]<=max+1);
}
void Partitii_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
15
2014
{
while (V[k]<k)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
Citeste();
Partitii_Back ();
}
15. PROBLEMA COLORRII HARILOR. Find dat o hart cu N ri, se cer toate soluiile de colorare a
hrii utiliznd maxim 4 culori, astfel nct oricare dintre dou ri cu frontier comun s fie colorate cu
culori diferite.
typedef char culoare [20];
culoare C[5];
int N, V[10], A[10][10];
void Citeste (char * p)
{
strcpy (C[1], "rosu");
strcpy (C[2], "verde");
strcpy (C[3], "galben");
strcpy (C[4], "albastru");
fstream F(p, ios::in);
F>> N;
for (int i=1, j; i<= N; i++)
for (j=1 ;j<=N; j++)
A[i][j] = 0;
while (! F.eof ())
{
F>> i; char c=' ';
while ((c!= '\n') && (!F.eof()))
{
F>>j;
A[i][j]=1; A[j][i]=1;
c=F.get();
}
}
for (i=1; i<= N; i++)
{
cout << endl ;
for (j=1 ;j<=N; j++)
cout << A[i][j] << " ";
}
}
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << setw(10)<< C[V[j]]<< " ";
}
int Valid (int k)
{
if (k>1)
for (int i=1; i<=k-1; i++)
if ((V[k]==V[i]) && (A[k][i]))
return 0;
16
2014
return 1;
}
void Colorare_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<4)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
Citeste("B15harta.txt");
Colorare_Back ();
}
16. PROBLEMA COMIS-VOIAJORULUI. Un comis-voiajor trebuie s viziteze un numr de N orae. Iniial
acesta se afl ntr-unul din ele notat 1. Comis-voiajorul dorete s nu treac de dou ori prin acelai ora
iar la ntoarcere s revin n oraul 1. Cunoscnd legturile dintre orae, se cere s se tipreasc toate
drumurile poibile pe care le poate efectua comis-voiajorul.
int N, V[10], A[10][10];
void Citeste (char * p)
{
fstream F (p, ios::in);
F>> N;
for (int i=1, j; i<= N; i++)
for (j=1 ;j<=N; j++)
A[i][j] = 0;
while (! F.eof ())
{
F>> i;
char c=' ';
while ((c!= '\n') && (!F.eof()))
{
F>>j;
A[i][j]=1; A[j][i]=1;
c=F.get();
}
}
for (i=1; i<= N; i++)
{
cout << endl ;
for (j=1 ;j<=N; j++)
cout << A[i][j] << " ";
}
F.close();
}
int Solutie (int k)
{
return ((k==N) && (A[V[1], V[k]]));
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << setw(3)<< V[j]<< " ";
cout << setw(3)<<V[1];
}
17
2014
18
2014
{
long S=0;
for (int i=1; i<= k; i++)
S += V[i] * M[i];
return ( ::S >= S );
}
void Monede_Back ()
{
for (int k=1; k<=N; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<Max[k])
{
V[k] ++;
if (Valid(k))
{
if (Solutie(k))
Tipar (k);
else
if (k<N) k++;
}
else
V[k]=Max[k];
}
V[k--]=-1;
}
}
void main (void)
{
Citeste("BI17mone.txt");
Monede_Back ();
}
18. PARTIIILE UNUI NUMR NATURAL. Se citete un numr natural N. Se cere s se tipreasc toate
modurile de descompunere a sa ca sum de numere naturale (Exemplu pentru numrul 4: 1111, 112, 121,
13, 211, ).
int N, V[10];
int Solutie (int k)
{
for (int i=1, S=0; i<=k; i++)
S += V[i];
return (S==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
for (int i=1, S=0; i<=k; i++)
S += V[i];
return (S<=N);
}
void Partitii_Numar_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N+1-k)
{
V[k] ++;
if (Valid(k))
{
19
2014
if (Solutie(k))
Tipar (k);
else
if (k<N)
k++;
}
else
V[k] = N+1-k;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
Partitii_Numar_Back ();
}
19. DESCOMPUNERE. S se decompun un numr natural N n toate modurile posibile ca sum de p
numere naturale distincte. (p<=N).
int N,P, V[100];
int Solutie (int k)
{
for (int i=1, S=0; i<=k; i++)
S += V[i];
return (S==N) && (k==P);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k-1; j++)
cout <<setw(4)<< V[j]<< "
+";
cout <<setw(4)<< V[k] << " = " << N;
}
int Valid (int k)
{
for (int j=1; j<k; j++)
if (V[k]==V[j])
return 0;
for (int i=1, S=0; i<=k; i++)
S += V[i];
return (S<=N);
}
void Descompune_Numar_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N+1-k)
{
V[k] ++;
if (Valid(k))
{
if (Solutie(k))
Tipar (k);
else
if (k<P)
k++;
}
else
V[k] = N+1-k;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
20
2014
21
2014
20. DESCOMPUNERE CA SUMA DE NUMERE PRIME. Fiind dat un numr natural N, se cere s se afieze
toate descompunerile numrului respectiv ca sum de numere prime.
int N, V[10];
int Suma (int k)
{
int S=0;
for (int i=1; i<=k ; i++)
S+=V[i];
return S;
}
int Prim (int x)
{
if (x<=1) return 0;
for (int i=2; i<=sqrt(x); i++)
if (x%i==0)
return 0;
return 1;
}
int Solutie (int k)
{
return (Suma(k)==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
return ((Prim(V[k])) && (Suma(k)<=N));
}
void Descompune_Prime_Back ()
{
for (int k=1; k<=N; k++)
V[k]=1;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=1;
}
}
void main (void)
{
cout << "N="; cin >> N;
Descompune_Prime_Back ();
}
21. DELEGAII. Dintr-un grup de N persoane, dintre care p femei, trebuie format o delegaie de K
persoane, din care L femei. S se precizeze toate delegaiile care se pot forma.
const NMAX = 10;
int N,P, K, L, V[NMAX], Min [NMAX], Max[NMAX];
int Solutie (int k)
{
return (k==K);
}
void Tipar (int k)
{
cout << endl;textcolor(RED);
for (int j=1; j<=L; j++)
22
2014
23
2014
24
2014
while (k>0)
{
while (V[k]<N-1)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=1;
}
}
void main (void)
{
cout << "N="; cin >> N;
Descompune_Numere_Consecutive_Back ();
}
24. COTROCENI. La palatul COTROCENI se ine o conferin de pres la care trebue s ia cuvntul 5
purttori de cuvnt numii A, B, C, D, E. Afiai toate modurile de nscriere la cuvnt astfel nct persoana
A s vorbeasc mai trziu dect persoana D i persoana E s fie printre primele trei persoane care
vorbesc.
int V[10];
fstream F("cotrocen.txt", ios::out);
int Solutie (int k)
{
return (k==5);
}
void Tipar (int k)
{
F << endl;
for (int j=1; j<=k; j++)
F << char(V[j]+64)<< " ";
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
if (V[k]==1)
for (i=1; i<k; i++)
if (V[i]==4)
return 0;
if (V[k]==5)
if (k>3)
return 0;
return 1;
}
void Cotroceni_Back ()
{
for (int k=1; k<=5; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<5)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
25
2014
}
void main (void)
{
Cotroceni_Back ();
}
25. SUBMULIMI DE SUMA S. S se genereze toate submulimile de cte M elemente ale unei mulimi de
N elemente pentru care suma elementelor s nu depeasc o valoare maxim Smax.
int N, M, V[10], T[10], Smax;
int Nr_Elemente (int k)
{
for (int i=1, nr=0; i<=k; i++)
if (V[i])
nr++;
return nr;
}
int Suma (int k)
{
for (int i=1, S=0; i<=k; i++)
if (V[i])
S+=T[i];
return S;
}
int Valid (int k)
{
return (Suma(k)<=Smax);
}
void Citeste()
{
cout << "nr elemente: "; cin >> N;
for (int i= 1; i<= N; i++)
{
cout << "element " << i <<
" : ";
cin >> T[i];
}
cout<< "M= (nr de elem ale submultimii) ";
cin >> M;
cout<< "Smax= (Suma maxima) ";
cin >> Smax;
}
int Solutie (int k)
{
return (Nr_Elemente(k)==M);
}
void Tipar (int k)
{
cout << endl<< " { ";
for (int j=1; j<=k; j++)
if (V[j])
cout << T[j]<< " ";
cout << "}";
}
void Submultimi_Suma_Data_Back ()
{
for (int k=1; k<=N; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<1)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
26
2014
k++;
}
V[k--]=-1;
}
}
void main (void)
{
Citeste();
Submultimi_Suma_Data_Back ();
}
26. EXAMEN. S se elaboreze toate modalitile de a promova un examen care conine N probe, tiind c
la fiecare prob (i) se poate obine un punctaj ntre 1 i (P[i]) iar pentru a fi promovat, un candidat trebuie
s obin mcar M puncte.
int N, M,V[10], P[10];
void Citeste ()
{
cout << "Numar de probe "; cin >> N;
for (int i=1; i<=N; i++)
{
cout << "Punctaj maxim test " << i << " ";
cin >> P[i];
}
cout << "Punctaj minim necesar: " ; cin >> M;
}
int Punctaj (int k)
{
for (int i=1, S=0; i<=k; i++)
S+=V[i];
return S;
}
int Solutie (int k)
{
return (k==N) && (Punctaj(k)>=M);
}
void Tipar (int k)
{
cout << endl<<"--------------------------------";
for (int j=1; j<=k; j++)
cout<<endl<< "test "<<j << " Puncte : "<<V[j];
}
void Examen ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<P[k])
{
V[k] ++;
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
Citeste();
Examen();
}
27. SIR FR NUMERE CONSECUTIVE. S se alctuiasc toate irurile posibile de cte N numere
naturale distincte alese din primele N numere naturale astfel nct s nu existe dou numere consecutive
aezate alturi.
27
2014
int N, V[10];
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
if (k>1)
if (abs(V[k]-V[k-1])==1)
return 0;
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Fara_Consecutive_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
Fara_Consecutive_Back ();
}
28. MATRICE PATRATIC BINAR. SIMETRIC. S se genereze toate matricile ptratice de dimensiune N,
formate doar cu elemente 0 i 1, simetrice fa de diagonala principal i cu diagonala principal 0.
int N, V[100], A[10][10];
int Solutie (int k)
{
return (k==(N*(N-1)/2));
}
void Afisare ()
{
cout << "------------------------"<<endl;
for (int i=1; i<=N; i++)
{
for (int j=1; j<=N; j++)
cout << A[i][j]<< " ";
cout << endl;
}
}
void Tipar ()
{
for (int i=1, p=1; i<= N-1; i++)
for (int j=i+1; j<=N; j++)
{
28
2014
A[i][j] = V[p];
A[j][i] = V[p];
p++;
}
Afisare();
}
void Matr_Sim_Back ()
{
for (int k=1; k<=N*(N-1)/2; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<1)
{
V[k] ++;
if (Solutie(k))
Tipar ();
else
k++;
}
V[k--]=-1;
}
}
void main (void)
{
cout << "N="; cin >> N;
Matr_Sim_Back ();
}
29. MATRICE BINARA CU UN maxim N de 1. S se genereze toate matricile ptratice de dimensiune N,
formate doar cu elemente 0 i 1 cu proprietatea c pe fiecare linie exist un singur 1i pe fiecare coloan
apare o singur dat cifra 1.
int N, V[10], A[10][10];
fstream F("BI29mlc1.txt", ios::out);
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
int i, j;
for (i=1 ; i<= k; i++)
for (j=1; j<=k; j++)
A[i][j]=0;
for (i=1 ; i<=k; i++)
if (V[i])
A[i][V[i]]=1;
F << endl<<"----------------------";
for (i=1; i<=k; i++)
{
F << endl;
for (j=1; j<=k; j++)
F << A[i][j]<< " ";
}
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k])
if (V[k]==V[i])
return 0;
return 1;
}
void Matrice_LC1_Back ()
{
for (int k=1; k<=N; k++)
V[k]=-1;
29
2014
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=-1;
}
}
void main (void)
{
cout << "N="; cin >> N;Matrice_LC1_Back ();
F.close();
}
30. TEZE. O clas de elevi trebuie s programeze M teze n N zile. Determinai toate posibilitile de
programare a tezelor tiind c nu se pot susine dou teze n aceeai zi.
int N, M, V[10];
int Solutie (int k)
{
return (k==M);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << endl<<"TEZA "<< j<< " In ziua: "<<V[j]<< " ";
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])return 0;
return 1;
}
void Teze_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "Numar zile: "; cin >> N;
cout << "Numar teze: "; cin >> M;
Teze_Back ();
}
31. MELODII. S se genereze toate posibilitile de a aranjare pe o caset a N melodii, astfel nct melodia
x s se cnte dup melodia y.
int N, V[100], x, y;
30
2014
31
2014
32
2014
}
void Bine_Ordonate_Back ()
{
for (int k=1; k<=9; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<9)
{
V[k] ++;
if (Valid(k))
if (k==3)
Tipar ();
else
k++;
}
V[k--]=-1;
}
}
void main (void)
{
Bine_Ordonate_Back ();
}
34. Se citete un numr natural N i un numr natural V, (V<N). S se afieze toate modurile n care pot fi
aranjate numerele de la 1 la N astfel nct diferena n modul dintre dou numere alturate s fie mai mic
sau egal dect V.
int N,v, V[10];
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
if (k>1)
if (abs(V[k]-V[k-1])>v)
return 0;
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Diferenta_Modul_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
33
2014
34
2014
}
cout << Nr<< " ";
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
if (k>1)
if ((T[V[k]]%2 + T[V[k-1]]%2) !=1)
return 0;
return 1;
}
void Par_Impar_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<5)
{
V[k] ++;
if (Valid(k))
if (k==5)
Tipar ();
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
Par_Impar_Back ();
}
37. S se genereze N vectori de lungime P cu elemente 1 i 2 cu proprietatea c suma elementelor este
egal cu un S dat.
int N,S,P ,V[100];
void Tipar (int &k)
{
if (N)
{
N--;
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
else
{
V[k]=2;
k=0;
}
}
int Suma (int k)
{
for (int i=1, S=0; i<=k; i++)
S+=V[i];
return S;
}
void Vectori_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
35
2014
k=1;
while (k>0)
{
while (V[k]<2)
{
V[k] ++;
if (Suma(k)<=S)
if ((k==P)&&(Suma(k)==S))
Tipar (k);
else
if (k<P)
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "Numar vectori "; cin >> N;
cout << "Suma "; cin >> S;
cout << "Lungime vectori "; cin >> P;
Vectori_Back ();
if (N)
cout << "nu s-au gasit toate solutiile cerute";
}
38. Se consider n obiecte avnd greutile g1, g2, , gN. S se afieze toate posibilitile de a echilibra o
balan ce are pe braul din stnga un obiect de greutate G. Determinai soluia la care echilibrarea se
face cu numr minim de greuti.
int N, G[100], V[100], M, Min, Minim[100];
void Citeste (char * p)
{
fstream F(p, ios::in);
F>>N>>M;
for (int i=1; i<=N; i++)
F>> G[i];
F.close();
Min = N+1;
}
int Suma (int k)
{
for (int i=1, S=0; i<=k; i++)
if (V[i])
S+=G[i];
return S;
}
int Solutie (int k)
{
return (Suma(k)==M);
}
void Tipar (int k)
{
for (int i=1, nr=0; i<=k; i++)
if (V[i])
nr++;
if (nr<Min)
{
Min = nr;
int p=1;
for (int j=1; j<=k; j++)
if (V[j])
Minim[p++]= G[j];
}
cout << endl;
for (int j=1; j<=k; j++)
if (V[j])
cout << G[j]<< " ";
}
36
2014
37
2014
return 0;
if (Numar_intrebari(k)<a)
return 0;
return 1;
}
void Tipar (int k)
{
cout << endl<< " { ";
for (int j=1; j<=k; j++)
if (V[j])
cout << T[j]<< " ";
cout << "}";
}
void Chestionar_Back ()
{
for (int k=1; k<=N; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<1)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
if (k<N)
k++;
}
V[k--]=-1;
}
}
void main (void)
{
Citeste("BI39ches.txt");
Chestionar_Back ();
}
40. S se genereze toate submulimile de cte M elemente a unei mulimi de N numere naturale pentru
care suma elementelor s se ncadreze n intervalul [a,b].
int N, M, V[10], T[10], a, b;
void Citeste(char * fisier)
{
fstream F(fisier, ios::in);
F>>N>>M>>a>>b;
for (int i= 1; i<= N; i++)
F >> T[i];
F.close();
}
int Numar_elemente (int k)
{
for (int i=1, nr=0; i<=k; i++)
if (V[i])
nr++;
return nr;
}
int Suma_acumulata(int k)
{
for (int i=1, S=0; i<=k; i++)
if (V[i])
S += T[i];
return S;
}
int Valid (int k)
{
if (Numar_elemente (k) > M)
return 0;
if (Suma_acumulata(k)>b)
38
2014
return 0;
return 1;
}
int Solutie (int k)
{
if (Numar_elemente(k)!=M)
return 0;
if (Suma_acumulata(k)<a)
return 0;
return 1;
}
void Tipar (int k)
{
cout << endl<< " { ";
for (int j=1; j<=k; j++)
if (V[j])
cout << T[j]<< " ";
cout << "}";
}
void Submultimi_Suma_Interval_Back ()
{
for (int k=1; k<=N; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<1)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
if (k<N)
k++;
}
V[k--]=-1;
}
}
void main (void)
{
Citeste("BI40smni.txt");
Submultimi_Suma_Interval_Back ();
}
FISIERE HEADER
# include <fstream.h>
# include <string.h>
# include <conio.h>
# include <math.h>
# include <iomanip.h>
# include <ctype.h>
FISERE TEXT
Problema 8
3 2
1 5
7 4
-1 10
Problema 9
4
3
1 2 3
3
39
2014
4 5 6
2
7 8
2
9 10
Problema 15
7
1 2 3 4 5 6 7
2 3 4
3 4 6 7
4 5 7
5 7
6 7
Problema 16
6
1 2 3 5 6
2 3 4
3 4
4 5 6
5 6
Problema 17
5
1430000
10000 50000 100000 500000 1000000
Problema 32
4 3
2 rosu
3 galben
4 rosu
2 verde
Problema 38
7 15
10 2 3 4 5 6 1
Problema 39
5
3 4
15 20
8 7 10 5 8
Problema 40
5
3
2 8
1 2 3 4 5
40
2014
41