Combinările reprezintă numărul tuturor submulțimilor de elemente ale unei mulțimi cu elemente.
Combinările sunt practic aranjamente în care ținem cont de ordine. De exemplu adică mulțimea neordonată , spre deosebire de aranjamente unde adică și . Așa că combinările sunt mulțimi neordonate, deci aproape întotdeauna , excepția fiind când , atunci .
Ultima varianta este cea mai bună pentru programare, deoarece se folosește recursivitate, față de primele 2 variante unde s-ar ajunge la numere foarte mari înainte de împărțire, care nu pot fii stocate în C++. Metoda aceasta reiese din Triunghiul lui Pascal. Evident pentru a evita calcule repetate se poate utiliza memoizarea.
Numărul de combinări
Metoda recursivă:
int combinari(int n, int k){
if(k == 0 || n == k)
return 1;
return combinari(n-1, k) + combinari(n-1, k-1);
}Generarea combinărilor
Pentru a face algoritmul mai ușor, considerăm că elementele din combinările generate vor fii întotdeauna ordonate, deci modificăm algoritmul de generarea aranjamentelor. Totuși nu este destul să modificăm doar condiția de afișare și să verificăm dacă elementele sunt ordonate crescător, deoarece ar fii foarte ineficient, așa că modificăm condiția for pentru a începe de la i = x[pas-1]+1 . De asemenea este important să observăm că într-o combinare nu putem avea niciodată pe poziția pas o valoare mai mare decât n - (k-pas) (De exemplu pentru nu vom avea niciodată pe poziția 1 sau 2 numărul 5), deci modificăm condiția for ca i <= n - k + pas. Pentru că le generăm în ordine nu mai avem nevoie nici de condiții suplimentare, nici de vectorul caracteristic P[ ] cu care verificam dacă un număr a fost folosit deja, deoarece generarea ordonată ne asigură că elementele nu se vor repeta niciodată. Astfel ajungem la cea mai bună complexitate posibilă pentru și anume , n fiind afișările
int n, k;
int x[11];
void afis(){
for(int i = 1; i <= k; ++i)
cout << x[i] << ' ';
cout << '\n';
}
void back(int pas){
for(int i = x[pas - 1] + 1; i <= n - (k - pas); ++i){
x[pas] = i;
if(pas == k)
afis();
else
back(pas + 1);
}
}
int main(){
cin >> n >> k;
back(1);
return 0;
}Alte formule și explicații matematice
Numărul de submulțimi
Numărul tuturor (inclusiv mulțimea vidă) submulțimilor dintr-o mulțime este:
Numărul de mulțimi cu 0 elemente care este calculată ca este 1, și anume mulțimea vidă Deci numărul de submulțimi nevide este:
Binomul lui Newton folosind combinări
Astfel formula termenului general de rang este:
Sau recurent pentru rangul :
Alte identități