Задание по программингу
Как мне кажется, можно попробовать следующее. Когда три круга с радиусами a, b, c касаются, их радиусы образуют треугольник со сторонами a+b, b+c и с+a. (Радиусы касающихся кругов лежат на одной прямой, отсюда один шаг до треугольника.)

Зная стороны треугольника, можем вычислить его углы. Вычислим для начала угол в центре a. Возьмем следующий круг d и приставим его к a и c. Образуется еще один треугольник из кругов a, c и d. Мы опять-таки можем вычислить его угол. Очевидно, мы можем таким образом укладывать круги вокруг a до тех пор, пока сумма внутренних углов не превысит 360 градусов. 


После этого мы можем начать укладывать оставшиеся круги вокруг b. У него к этому времени уже будет занята часть круга — кругами a, c и, возможно, последним кругом, уложенным с другой стороны a.

Зная стороны и углы мы знаем центр круга и, таким образом, его вертикальные и горизонтальные границы. В процессе укладки можно отслеживать максимальную границу, чтобы ненароком не выйти за размер прямоугольника.

Возможно, в процессе работы будет имеет смысл добавлять воображаемые круги-заполнители.

Это не полное решение (алгоритма, кроме перебора, я не предложу, кроме того, возможны варианты, когда в промежуток между тремя касающимися кругами можно всунуть еще маленький кружок, так что алгоритм, возможно, будет довольно сложным). Но начало, кажется, хорошее.
Ну так отсортируйте радиусы в порядке возрастания. Потом жадно пихайте самый большой радиус в центр прямоугольника. Потом следующий и смотрите, пересекаются ли окружности. Пересекаться (вернее одна окружность будет внутри другой) они будут, поэтому двигаем второй радиус куда-нибудь, до тех пор, пока пересекаться не будут (смотрим сюда http://e-maxx.ru/algo/circles_intersection).

Оно?