En la programación en C, dada una matriz de tamaño n, ¿cómo encuentras la suma de todas las combinaciones posibles de sus números?

La solución recursiva a esto es extremadamente fácil.

  • Si la lista de números está vacía, la respuesta es una lista con solo 0.
  • Si la lista tiene dos o más elementos, divídalos en una cabeza (el primer elemento) y una cola (el resto de la lista). Encuentre todas las sumas posibles en la cola, duplique el resultado, agregue el encabezado a una de las copias y vuelva a fusionarlas en una sola lista, eliminando valores duplicados.

De acuerdo, C no es realmente el lenguaje que usaría para implementar esto.

Una ilustración de cómo funciona:

sumas [1, 2, 3]
1 -> sumas [2, 3]
1 -> (2 -> sumas [3])
1 -> (2 -> (3 -> sumas []))
1 -> (2 -> (3 -> [0]))
1 -> (2 -> ([0], [3]))
1 -> (2 -> [0, 3])
1 -> ([0, 3], [2, 5])
1 -> [0, 2, 3, 5]
[0, 2, 3, 5], [1, 3, 4, 6]
[0, 1, 2, 3, 4, 5, 6]

Como otros ya han señalado correctamente, la memoria requerida solo para almacenar la respuesta es, en el peor de los casos, proporcional a [matemáticas] 2 ^ n [/ matemáticas], y así será el tiempo de ejecución.

También podría generar enteros de 0 a [matemática] 2 ^ n-1 [/ matemática] y usarlos como máscaras de bits para los elementos que se deben sumar. La peor eficiencia del caso es la misma, pero el caso promedio para el algoritmo recursivo es un poquito mejor.

No podrá generar dicha matriz si su n> 30 , porque 2 ^ n de memoria es demasiado para una matriz.

Suma de todas las combinaciones posibles:

Digamos que la suma de la matriz de entrada es SUM.

Cada elemento existe en 2 ^ (n-1) subconjuntos. Es por eso que el resultado es SUM * 2 ^ (n-1)

Proponerlo es divertido.

Pero si desea hacer trampa, Google proporciona métodos que puede utilizar, incluido este agradable: Análisis de algoritmos: Conferencia 24

No olvide el problema secundario aquí de suprimir duplicados (es decir, un conjunto), si entiendo su pregunta correctamente.

Tendría que calcular el conjunto de todos los subconjuntos de la matriz, conocido como el conjunto de potencia, y sumar cada conjunto en él (supongo que la matriz no contiene duplicados). Esto podría ser computacionalmente costoso, ya que el tamaño del conjunto de potencia es 2 ^ n, donde n es el tamaño del conjunto (en su caso, la matriz)