Problema complicado, deixa-me pensar.
Ora, tens o rectangulo grande não é, pegas no comprimento do retangulo pequeno e divides o comprimento do rectangulo pequeno pelo comprimento do rectangulo grande, no fim guardas o resto.
Fazes o mesmo com a altura do pequeno a dividir pela altura do grande e agora somas ao resto obtido anteriormente e guardas.
Agora, rodas o quadrado pequeno, que é a mesma coisa que trocar o comprimento pela a altura, voltas a fazer as divisões, somar os restos e guardar.
Fazes uma comparação entre os restos e a posição que tiver menos resto, é a posição ideal para enxer o rectangulo grande até a cima.
Mas ainda nao acabou.
Se subtrair-mos o conjunto de rectangulos que enxemos ao rectangulo grande, ficamos com uma area em forma de L (roda o L mentalmente sff).
Podes dividir esse L em 2 rectangulos e voltar a encher de rectangulos pequenos com o mesmo algoritmo.
Não sei é o algoritmo ideal, mas foi o melhor que consegui pensar (em 5 mins).
Cumps e boa sorte.
EDIT: depois de dar uma vista de olhos pelo teu codigo, é +- isto que tás a tentar, ou não?