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
: A
1
, A
2
, …, A
k
cu proprietatea că A=A
1
U A
2
U...U A
k
.
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.
#include <bits/stdc++.h> using namespace std; ifstream cin("pm.in"); ofstream cout("pm.out"); int x[10], n , m; int maxim(int k) { int maxi = 0; for(int i = 1 ; i <= k ; i++) maxi = max(x[i] , maxi); return maxi; } void afisare() { int maxi = maxim(n); if(maxi == m) { for(int i = 1 ; i <= maxi ; i++) { for(int j = 1 ; j <= n ; j++) if(x[j] == i) cout << j; cout << "*"; } cout << '\n'; } } void back(int k) { for(int i = 1 ; i <= maxim(k - 1)+1 ; i++) { x[k] = i; if(k == n) afisare(); else back(k + 1); } } int main() { cin >> n >> m; x[1] = 1; back(2); return 0; }