Это подвид алгоритма о упаковке рюкзака, (или алгоритм раскроя). Т.к. у вас маленький рюкзак, можно не заморачиваться со всякими сложностями типа генетических алгоритмов и аппроксимаций, а при каждом добавлении предмета даже полный перебор делать. Естественно, в начале можно проверить есть ли вообще нужное количество свободных ячеек, и если есть - поместить в ближайшую свободную область, и только если ячеек хватает, но они фрагментированы - делать перебор.
Библиотек под это дело
множество, т.к. их периодически студентам на лабах задают писать. Поищите "knapsack 2d" или "cutting stock 2d".