Yo lo haría también parecido a como dice #4:
Tenemos inicialmente:
A = 2
B = 3
C = 5
En primer lugar, ordenamos los grupos por tamaño de forma decreciente, es decir: C, B, A.
Además, hay que tener un vector auxiliar con las cajas libres, es decir:
aux[0] = 1
aux[1] = 2
aux[2] = 3
aux[3] = 4
aux[4] = 5
aux[5] = 6
aux[6] = 7
aux[7] = 8
aux[8] = 9
aux[9] = 10
Y la operación que hay que hacer, para cada uno de los grupos (C, B y A) es:
redondeo(tamaño_aux / tamaño_grupo)
Es decir, primero, para C, haríamos:
redondeo(10.0 / 5.0) = 2
Por lo que asignamos un C cada dos cajas, es decir, en las cajas 1, 3, 5, 7 y 9 (correspondientes a las posiciones 0, 2, 4, 6 y 8 del vector auxiliar). Además, eliminamos esos elementos del vector auxiliar, quedando así:
aux[0] = 2
aux[1] = 4
aux[2] = 6
aux[3] = 8
aux[4] = 10
Luego hacemos lo mismo para B:
redondeo(5.0 / 3.0) = redondeo(1.6666) = 2
Por lo que metemos un B cada 2 posiciones, es decir, en la posición 0, 2 y 4 del vector auxiliar (correspondientes a las cajas 2, 6 y 10, respectivamente). Tras eliminar estos elementos del vector auxiliar, tendríamos:
aux[0] = 4
aux[1] = 8
Y hacemos el mismo procedimiento para A (esto ya es trivial).
Seguramente haya otras implementaciones más eficientes, pero ésta es la primera que se me ha venido a la cabeza y creo que funciona bien para todos los casos. Con bien me refiero a sin errores... Por por ejemplo se me ocurre un escenario en el que no lo organiza bien del todo:
A = 5
B = 2
Haciendo para A:
redondeo(7.0 / 5.0) = redondeo(1.4) = 1
Metería los A en las cinco primeras posiciones... Pero se me ocurre que esto se puede solucionar ordenándolos de menor a mayor, es decir, haciendo primero B y luego A.
Y, en el caso anterior, primero A, luego B y por último C, a ver, haciéndolo de nuevo:
A = 2
B = 3
C = 5
aux[0] = 1
aux[1] = 2
aux[2] = 3
aux[3] = 4
aux[4] = 5
aux[5] = 6
aux[6] = 7
aux[7] = 8
aux[8] = 9
aux[9] = 10
Primero con A:
redondeo(10.0 / 2.0) = 5
Por lo que A va en las posiciones 0 y 5, correspondientes a las cajas 1 y 6, y el auxiliar quedaría:
aux[0] = 2
aux[1] = 3
aux[2] = 4
aux[3] = 5
aux[4] = 7
aux[5] = 8
aux[6] = 9
aux[7] = 10
Luego para B:
redondeo(8.0 / 3.0) = redondeo(2.6666) = 3
Por lo que B las metemos en las posiciones 0, 3, y 6 (correspondientes a las cajas 2, 5 y 9), quedando aux:
aux[0] = 3
aux[1] = 4
aux[2] = 7
aux[3] = 8
aux[4] = 10
Y C es trivial. Al final quedaría:
A-B-C-C-B-A-C-C-B-C
No sé, esto parece que funciona... En resumen es el mismo que te dije al principio, pero ordenando los grupos de menor tamaño a mayor tamaño.
Salu2.
EDIT:
De todas formas, esto tampoco es perfecto, imagínate el escenario:
A = 1
B = 6
El resultado final sería: A-B-B-B-B-B-B, y lo ideal hubiera sido algo así como: B-B-B-A-B-B-B... La verdad es que hacer bien este problema no es sencillo, quizá lo suyo es que busques por internet algoritmos ya estudiados, y acabarás antes xD. Quizá jugando con las medianas puedas llegar a una solución mejor, no sé, es tarde y no me da pa más la cabeza, suerte xD