Problem można sprowadzić do problemu wyznaczania maksymalnego przepływu w grafie, jednak otrzymana złożoność będzie średnio satysfakcjonująca (nawet przy wydajnym push and relabel, który działa ze złożonością O(V2*E), gdzie u nas E byłoby rzędu V 2).
Edit: Ok, nie przeczytałem, że to ma być algorytm zachłanny. W takim razie przechodzisz po prostu po kolejnych dzieciach i każdemu z nich próbujesz dać jak najlepszy dla niego prezent (o ile nie został wcześniej przyznany).
Pseudokod:
int[] prezenty = new int[N];
int[,] oceny = new int[N,N];
inicjalizacjaTablicyOceny(oceny); //pierwszy indeks numer dziecka, drugi numer prezentu
inicjalizacjaTablicyPrezenty(prezenty); //wypelnij wartosciami -1, ew. nullable i wtedy null
foreach (dziecko d)
{
znajdz nieprzyznany prezent p o najwyzszej ocenie dziecka d
prezenty[p]=d; //przyznaj prezent p dziecku d
}
return prezenty; //tablica zawierająca numer dziecka, ktore otrzymalo prezent
Oczywiście algorytm zachłanny może zwrócić rozwiązanie nieoptymalne w przeciwieństwie do push and relabel.