Sunteți pe pagina 1din 1

3.

Generarea combinrilor
Se citesc dou numere naturale n i c, cu 1 c n. Se cere s se tipreasc toate combinrile de n
elemente luate cate c, n ordine lexicografic. De exemplu, pentru n=3 i c=2 avem combinrile :
1 2,
13,
23.
Definiie: Fie A o mulime cu n elemente. Combinrile de n elemente luate cte c sunt toate
submulimile ale lui A care au fiecare cte c elemente.
Reprezentarea soluiei: - fiecare component are valori n mulimea {1,2,.,n}
-soluia are c componente
Condiia de validare: - componentele unei soluii sunt diferite (condiia de la permutri)
- componentele unei soluii le scriem n ordine cresctoare
Din cele dou condiii rmne doar condiia ca soluia s aib componentele n ordine cresctoare.
Pentru soluia parial (x1,x2,...,xk-1) avem x1 < x2 <...< xk-1 . Pentru a trece la soluia urmtoare
(x1,x2,...,xk-1,xk) mai trebuie s verificm doar condiia: xk-1 < xk.
Numrul combinrilor:

Varianta iterativ
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.

#include<iostream>
using namespace std;
int x[30];
int n,c,nr;
void tipar()
{
int i;
for(i=1;i<=c;i++)
cout<<x[i]<<' ';
cout<<'\n';
nr++;
}
int valid(int k)
{
int i;
if(x[k]>x[k-1])return 1;
return 0;
}
void back()
{
int i,k=1;
x[1]=0;
while(k>0)//stiva nu este vida
{
while(x[k]<n)
{
x[k]=x[k]+1;
if(valid(k))
if(k==c) tipar();
else{k=k+1;x[k]=0;}
}
k=k-1;
}
}
int main()
{
x[0]=0; //valoarea iniial
cin>>n;
cin>>c;
back();
cout<<nr;
}

Varianta recursiv
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.

#include<iostream>
using namespace std;
int x[30];
int n,c,nr;
void tipar()
{
int i;
for(i=1;i<=c;i++)
cout<<x[i]<<' ';
cout<<'\n';
nr++;
}
int valid(int k)
{
int i;
if(x[k]>x[k-1])return 1;
return 0;
}
void back(int k)
{
int i;
if(k==c+1)tipar();
else
for(i=1;i<=n;i++)
{
x[k]=i;
if(valid(k)) back(k+1);
}
}
int main()
{
x[0]=0; //valoarea iniial
cin>>n;
cin>>c;
back(1);
cout<<nr;
}

S-ar putea să vă placă și