Оптимальный раскрой материала

Имеется лист металла определенных размеров. Нужно как можно оптимальнее его раскроить на прямоугольники и квадраты требуемого размера(размеры можно варьировать, в зависимости от подгонки) так, чтобы по возможности не оставалось отходов. Как и в чем это сделать?