Generarea de combinații

Generarea de combinații

În combinatorie, o combinație de elemente distincte N în M este o colecție de elemente M selectate din setul de elemente N. Aceste seturi diferă numai în ceea ce privește apariția elementelor specifice M în ele, ordinea elementelor dintr-un astfel de set nu este importantă. Seturile care diferă numai în ordinea elementelor (dar nu și în compoziție) sunt considerate a fi identice, iar aceste combinații sunt diferite de destinațiile de plasare.






Combinații fără repetări

Sarcina. Găsiți toate combinațiile posibile fără repetiții din setul de elemente cu 2.
Există următoarele combinații:

Numărul de combinații posibile fără repetiția elementelor N peste M poate fi determinat prin formula (N≥M):

că în M! ori mai puțin decât numărul corespunzător de plasări fără repetări (deoarece combinațiile fără repetiții nu depind de ordinea elementelor).

Considerăm problema obținerii tuturor combinațiilor pentru numerele 1. N față de M.

Implementarea în C ++

#include
folosind namespace std;
bool NextSet (int * a, int n, int m)
int k = m;
pentru (int i = k - 1; i> = 0; - i)
dacă (a [i] ++a [i];
pentru (int j = i + 1; a [j] = a [j-1] + 1;
return true;
>
return false;
>
void Print (int * a, int n)
static int num = 1;
cout.width (3);
cout <





pentru (int i = 0; i cout < cout <>
int main ()
int n, m, * a;
cout <<"N = " ;
cin >> n;
cout <<"M = " ;
cin >> m;
a = nou int [n];
pentru (int i = 0; i a [i] = i + 1;
Imprimare (a, m);
dacă (n> = m)
în timp ce (NextSet (a, n, m))
Imprimare (a, m);
>
cin.get (); cin.get ();
retur 0;
>

Combinații cu repetări

Combinațiile cu repetări sunt numite seturi de elemente M în care fiecare element al setului N poate participa de mai multe ori. În același timp, nu se impun restricții asupra raportului dintre valorile lui M și N, iar numărul total de combinații cu repetări este

Un exemplu al unei astfel de probleme este alegerea cărților poștale M din N în toate modurile posibile.

Pentru a genera combinații cu repetiții, hai să folosim soluția pentru generarea de destinații de plasare cu repetări, luate în considerare în acest articol.

Implementarea în C ++

#include
folosind namespace std;
bool NextSet (int * a, int n, int m)
int j = m-1;
în timp ce (a [j] == n j> = 0) j-;
dacă (j <0) return false;
dacă (a [j]> = n)
j--;
a [j] ++;
dacă (j == m - 1) returnează adevărat;
pentru (int k = j + 1; k o [k] = a [j];
return true;
>
void Print (int * a, int n)
static int num = 1;
cout.width (3);
cout < pentru (int i = 0; i cout < cout <>
int main ()
int n, m, * a;
cout <<"N = " ;
cin >> n;
cout <<"M = " ;
cin >> m;
int h = n> m. n. m; // mărimea matricei a este aleasă ca max (n, m)
a = int int [h];
pentru (int i = 0; i a [i] = 1;
Imprimare (a, m);
în timp ce (NextSet (a, n, m))
Imprimare (a, m);
cin.get (); cin.get ();
retur 0;
>

Rezultatul algoritmului de mai sus:

Generarea de combinații

Generarea de combinații







Articole similare

Trimiteți-le prietenilor: