# PBinfo #3168 – PartitiiMultime1 – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

Cerința
Fie n un număr natural nenul, mulțimea A={1,2,3,...,n} și un număr m, 1 ≤ m ≤ n. Să se determine toate partițiile disjuncte ale mulțimii A, formate din exact m submulțimi. 

O partiție a mulțimii A este formată din k (1 ≤ k ≤ n) submulțimi disjuncte ale lui A: A1, A2, …, Ak cu proprietatea că A=A1U A2 U...U Ak.

Date de intrare
Fișierul de intrare pm.in conține pe prima linie numere n m.

Date de ieșire
Fișierul de ieșire pm.out va conține câte o linie pentru fiecare partiție determinată. Submulțimile vor fi separate în fiecare linie cu ajutorul caracterului *, iar elementele fiecărei submulțimi se vor scrie fără spațiere, ca în exemplul de mai jos.

Restricții și precizări

1 ≤ m ≤ n ≤ 9
Partițiile determinate se vor afișa în ordine lexicografică

Exemplu:
pm.in

3 2
pm.out

12*3*
13*2*
1*23*
Explicație
Mulțimea A are 5 partiții:


{1,2,3}
{1,2} U {3}
{1,3} U {2}
{1} U {2,3}
{1} U {2} U {3}

Dintre acestea, doar ({1,2} U {3}), ({1,3} U {2}), ({1} U {2,3}) sunt formate din m=2 multimi.

## Cod sursă C++

```cpp
#include <fstream>
#include <iostream>
using namespace std;
int x[10], n, m;
ofstream fout("pm.out");
ifstream fin("pm.in");
int maxim(int k)
{
    int i , z = 0;
    for(i = 1 ; i <= k ; i++)
        z = max(x[i] , z);
    return z;
}
void scrie(ostream & out)
{
    int z = maxim(n);
    for(int i = 1 ; i <= z ; i ++)
    {
        for(int j = 1 ; j <= n ; j ++)
            if(x[j] == i)
                out << j;
        out << "*";
    }
    out << '\n';
}
void back(int k)
{
    int s = maxim(k - 1);
    if(s > m)
        return;
    for(int i = 1; i <= s + 1 ; i++)
    {
        x[k] = i;
        if(k == n)
        {
            if(maxim(n) == m)
                scrie(fout);
        }
        else
            back(k + 1);
    }
}
int main()
{
    fin >> n >> m;
    x[1] = 1;
    back( 2 );
return 0;}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/3168)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/3168/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-3168/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
