Nie jestem jakimś specialistą, ale zrobiłbym tak:
1.Posortowałbym duży zbiór(najlepiej bąbelkowo)
2.Dobierał najmniejszy z największym, aż ich suma nie będzie większa od m, a resztę zostawiłbym w zbiorach 1-elementowych
3. Policzyłbym zbiory i wypisał jak trzeba.
Akurat się bawiłem z sortowaniem więc masz tutaj:
int sort(bool k=1){for(int i=0;i<l-1;i++)for(int j=1;j<l-i;j++)if(k==0){if(t[j]>t[j-1])swap(t[j],t[j-1]);}else if(t[j]<t[j-1])swap(t[j],t[j-1]);
t oraz l miałem w klasie, więc trzeba je dorobić