Las combinaciones con repetición cuentan selecciones en las que el orden no importa y un mismo tipo de elemento puede elegirse varias veces.
En una combinación sin repetición se seleccionan elementos diferentes. En una combinación con repetición, podemos seleccionar varias veces el mismo tipo, pero el orden de selección sigue sin importar.
Por ejemplo, elegir dos sabores de helado entre vainilla, chocolate y frutilla permite seleccionar vainilla dos veces. Vainilla-chocolate y chocolate-vainilla representan la misma elección.
Una combinación con repetición de n tipos tomados de k en k es una selección de tamaño k en la que:
Las selecciones BA, CA y CB no se agregan porque representan las mismas elecciones que AB, AC y BC.
La cantidad de combinaciones con repetición de n tipos tomados de k en k es:
Usando factoriales:
La fórmula convierte una selección con repetición en una combinación sin repetición sobre un conjunto ampliado.
Si hay 3 sabores y se eligen 4 porciones, permitiendo repetir sabores:
Una selección puede ser cuatro porciones de vainilla, o dos de vainilla, una de chocolate y una de frutilla.
Escribe entre 2 y 4 tipos y elige la cantidad de elementos seleccionados. La simulación muestra cada selección en orden no decreciente para evitar duplicados.
Una forma de entender la fórmula es representar los elementos seleccionados como estrellas y separar los tipos mediante barras.
En total colocamos k estrellas y n - 1 barras. Hay n + k - 1 posiciones, y elegimos cuáles ocupan las k estrellas.
Para generar combinaciones con repetición, el índice de la siguiente elección puede comenzar en el mismo índice utilizado, permitiendo repetir el tipo actual.
function combinacionesConRepeticion(elementos, k, inicio = 0, actual = [], resultados = []) {
if (actual.length === k) {
resultados.push([...actual]);
return resultados;
}
for (let indice = inicio; indice < elementos.length; indice += 1) {
actual.push(elementos[indice]);
combinacionesConRepeticion(elementos, k, indice, actual, resultados);
actual.pop();
}
return resultados;
}
const resultado = combinacionesConRepeticion(["A", "B", "C"], 2);
console.log(resultado.map(combinacion => combinacion.join("")));
La diferencia con las combinaciones sin repetición está en usar indice y no indice + 1 para la llamada recursiva.
Si solo necesitamos el total, calculamos el coeficiente binomial correspondiente:
function factorial(n) {
let resultado = 1;
for (let valor = 2; valor <= n; valor += 1) resultado *= valor;
return resultado;
}
function contarCombinacionesConRepeticion(n, k) {
return factorial(n + k - 1) / (factorial(k) * factorial(n - 1));
}
console.log(contarCombinacionesConRepeticion(3, 4));
El resultado es 15. Para cantidades grandes conviene simplificar o usar un cálculo de coeficientes binomiales más estable.
| Método | ¿Importa el orden? | ¿Se repite? | Fórmula |
|---|---|---|---|
| Combinación sin repetición | No | No | C(n, k) |
| Combinación con repetición | No | Sí | C(n + k - 1, k) |
| Variación con repetición | Sí | Sí | nk |
La fórmula básica supone que cada tipo puede utilizarse cualquier cantidad de veces. Si hay límites, como “no más de dos unidades de A”, debemos separar casos o utilizar técnicas adicionales de conteo.
Las restricciones transforman el problema en una distribución de cantidades entre categorías.
Las combinaciones con repetición permiten seleccionar cantidades de distintos tipos sin que el orden importe. Su fórmula transforma el problema en una combinación sin repetición de posiciones ocupadas por estrellas y barras separadoras.
En el próximo tema compararemos en profundidad permutaciones, variaciones y combinaciones.