Parece que você quer algo próximo ao alocador de amigos, para emprestar uma página (ha ha) do gerenciamento de memória.
Passo 1: Transforme o intervalo que você tem em uma série de blocos CIDR que são tão grandes quanto possível sem cruzar o limite de alcance ou se sobrepor a outro bloco.
Passo 2: Dada a alocação que você está tentando encaixar, encontre o menor bloco possível que irá se encaixar. O ideal é que isso corresponda exatamente a ele, mas se não, você dividirá o menor bloco que encontrou (potencialmente recursivamente) até que esteja no bloco de tamanho correto.
Meu texto não é particularmente elegante aqui, mas espero que você entenda a ideia.