Las combinaciones sin repetición cuentan selecciones de elementos diferentes cuando el orden no cambia el resultado.
En una variación, cambiar el orden produce un resultado diferente. En una combinación, solo importa qué elementos fueron seleccionados, no el orden en que se eligieron.
Por ejemplo, elegir a Ana y Luis para un equipo es la misma selección que elegir a Luis y Ana. Esta diferencia es el punto central de las combinaciones.
Una combinación sin repetición de n elementos tomados de k en k es un subconjunto de tamaño k formado con elementos distintos.
El conjunto {A, B} es igual al conjunto {B, A}; por eso solo se conserva una de las dos formas.
Si el orden importara, el problema sería una variación. Si se permitiera repetir, estudiaríamos combinaciones con repetición.
La cantidad de combinaciones sin repetición de n elementos tomados de k en k se expresa como:
También se escribe como el coeficiente binomial:
El factorial k! corrige las distintas formas de ordenar los mismos k elementos seleccionados.
De un grupo de 6 personas queremos formar un equipo de 3. El orden dentro del equipo no importa.
El equipo Ana-Luis-Marta es el mismo equipo que Marta-Ana-Luis.
Escribe entre 3 y 7 elementos y elige el tamaño de la selección. La simulación genera cada subconjunto una sola vez, sin considerar el orden.
Si primero ordenamos k elementos elegidos, cada combinación produce k! variaciones. Por eso:
La división por k! elimina los ordenamientos que representan la misma selección.
La función siguiente genera combinaciones utilizando un índice inicial. Así evita producir selecciones repetidas en distinto orden.
function combinaciones(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]);
combinaciones(elementos, k, indice + 1, actual, resultados);
actual.pop();
}
return resultados;
}
const resultado = combinaciones(["A", "B", "C", "D"], 2);
console.log(resultado.map(combinacion => combinacion.join("")));
El siguiente índice siempre es mayor que el anterior. Por eso una combinación no puede volver a incluir un elemento anterior.
Cuando solo necesitamos el total, podemos utilizar factoriales:
function factorial(n) {
let resultado = 1;
for (let valor = 2; valor <= n; valor += 1) resultado *= valor;
return resultado;
}
function contarCombinaciones(n, k) {
return factorial(n) / (factorial(k) * factorial(n - k));
}
console.log(contarCombinaciones(6, 3));
El resultado es 20. Para valores grandes conviene simplificar factores o utilizar métodos que eviten calcular factoriales completos.
La propiedad de simetría indica que elegir k elementos equivale a excluir n - k elementos.
Una condición puede exigir incluir o excluir determinados elementos. Por ejemplo, si A debe formar parte de un equipo de 3 elegido entre 6 personas, elegimos los otros 2 entre las 5 restantes:
Las restricciones se resuelven reduciendo el conjunto disponible o separando el problema en casos.
Las combinaciones sin repetición permiten seleccionar grupos de elementos diferentes cuando el orden no tiene importancia. Su fórmula corrige los ordenamientos duplicados que aparecen al contar primero como variaciones.
En el próximo tema estudiaremos las combinaciones con repetición, donde un mismo tipo de elemento puede seleccionarse más de una vez.