Borse di studio

Alla fine dell’anno scolastico, il preside dell’Istituto Tecnico Alan Turing scopre di avere una plusvalenza di bilancio di N migliaia di euro.
Il Consiglio d’Istituto decide di destinare tale plusvalenza distribuendola sotto forma di borse di studio da assegnare agli studenti meno abbienti.
Per farlo, viene per prima cosa stilata una graduatoria degli alunni della scuola in ordine di reddito (il primo nella graduatoria è lo studente con reddito più basso).
A questo punto gli N mila euro vengono redistribuiti rispettando i seguenti vincoli: se uno studente riceve X migliaia di euro, nessuno degli studenti che lo precedono in graduatoria può ricevere meno di X migliaia di euro; ciascuno studente riceve un numero intero di migliaia di euro (eventualmente zero).
Dovete scrivere un programma che, data l’entità N della plusvalenza, stabilisca in quanti e quali modi diversi possono essere ripartite le borse di studio in modo da rispettare i vincoli indicati.

Dati in input

Il file di input, di nome input.txt, contiene una sola riga, la quale contiene il singolo numero intero N.

Dati in output

Il file di output, di nome output.txt, è costituito da tante righe quanti sono i modi diversi di ripartire il denaro in borse di studio.
Ciascuna riga è costituita da una sequenza di numeri interi positivi, separati da uno spazio.
Se su una riga compaiono (in questo ordine) gli interi: X1, X2, …, Xk significa che, in quella ripartizione, al primo studente in graduatoria spetteranno X1 migliaia di euro, al secondo spetteranno X2 migliaia di euro, …, al k-esimo spetteranno Xk migliaia di euro; gli studenti dopo il k-esimo non riceveranno alcuna borsa di studio.

Importante

L’ordine in cui compaiono le righe nel file di output non è importante.
È invece importante che le possibili ripartizioni compaiano tutte e senza ripetizioni.

Assunzioni

  • 1 ≤ N ≤ 50
  • La scuola ha più di 100 studenti;
input.txt output.txt
6 1 1 1 1 1 1
2 1 1 1 1
3 1 1 1
2 2 1 1
4 1 1
3 2 1
5 1
2 2 2
4 2
3 3
6

/*
    www.valcon.it    
    OOI 2002 - Fase nazionale - BORSE DI STUDIO
*/  

#include
#include
using namespace std;

#define NMAX 50

ifstream fin;
ofstream fout;
         
int  N,                         // plusvalenza in migliaia di euro
     ripartizione[NMAX];        // una soluzione

void assegna(int daAssegnare, int massimo, int attuale)
{
	if(daAssegnare == 0)
    {
        for(int i=0; i < attuale; i++)
            fout << ripartizione[i] << ' ';
	    fout << endl;
	}
    else
    {
        for(int quota=1; quota <= min(daAssegnare,massimo); quota++)
        {
			ripartizione[attuale]=quota;
			assegna(daAssegnare-quota, quota, attuale+1);
		}
    }
}

int main()
{
	fin.open("input.txt");
	fout.open("output.txt");
	
	fin >> N;  
	assegna(N,N,0); 
	return 0;
}