È il classico "packing problem", problema combinatoriale che di base avrebbe complessità non polinomiale (O(n!) o peggio), per cui approcci "stupidi" al problema (=esaminare tutte le combinazioni per trovare quella ideale) sono in genere infattibili dato il numero di combinazioni che andrebbero provate; in ogni caso, finché si tratta di rettangoli e quadrati si trovano diverse soluzioni "abbastanza ottimali", dai un'occhiata qui per un'introduzione all'argomento e qui per un algoritmo pronto. Vedi anche qui per qualche altro link sulla soluzione di problemi di questo genere.