Всё сводится к классическим задачам оптимизации. Скорее всего ваша задача очень похожа на задачу об укладке рюкзака.
Решается, скорее всего, динамическим программированием или ветвями и границами.
Берете задачу о рюкзаке и приспосабливаете к своим условиям.
Если прямоугольников меньше сотни - полный перебор с выбором оптимального решения займет считанные секунды.
Если нет - ищете, где вы налажали.
Если не найдете - меняйте язык на не создающий объекты в памяти без спроса.