Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/01/2012, 06:08
mandibula120
 
Fecha de Ingreso: enero-2012
Ubicación: En españa dije...
Mensajes: 28
Antigüedad: 12 años, 8 meses
Puntos: 1
Igualar un array en dos

Hola, quizá el título sea un poco complicado pero es que no se puede expresar lo que quiero hacer en un título.

Veamos, primero voy a explicar lo que quiero hacer y después donde me quedo atascado.

Yo tengo un array de 10 elementos de tipo float. Lo que quiero hacer es separar ese array en dos arrays de 5 elementos cada uno, de tal forma que la suma de todos los elementos de cada array de 5 elementos sea lo más cercana posible. Me explico:

Supongamos que en mi array de 10 elementos, los 10 elementos son del 1 al 10.

Ahora el programa debería guardar en el array numero 1 (de 5 elementos), por ejemplo, el 10, el 7, el 6, el 3, y el 1. Y en el segundo array (de 5 elementos), guardaríamos los otros, el 9, el 8, el 5, el 4, y el 2.

Esto debe ser así porque la suma de los elementos del primer array es de 27, y la del segundo es de 28. O sea, lo que quiero es que la diferencia entre la suma de los elementos de cada array sea lo mínima posible.

Yo esto lo he pensado para números más altos (miles), así que he probado lo siguiente.

1- Ordenar el array. (Conseguido).
2- Sacar el porcentaje de cada elemento con respecto de la suma total. (Conseguido).

Aclaración punto 2: Esto es, que si la suma de todos los elementos del array de 10 elementos da 19000 y mi primer elemento es el 2800, que me diga que porcentaje es 2800 con respecto de 19000.

3- Ahora que tengo los porcentajes en un array, ordenados de la misma forma que los números del array de 10 elementos, quiero conseguir que, 5 de los 10 elementos del array sumen 50 (50%), o dicho de otra forma, que la suma se acerque lo máximo posible al 50.

Este es el punto que no consigo porque no sé como recorrer el array de porcentajes de tal forma que haga lo que yo pido, que sería obtener todas las sumas parciales posibles, es decir, todas las combinaciones, que serían.

1er elemento + (2º+3º+4º+5º)
1er elemento + (2º+3º+4º+6º)
1er elemento + (2º+3º+4º+7º)
.
.
.
1º elemento + (3º+4º+5º+6º)
1º elemento + (3º+4º+5º+7º)
.
.
.
...
...
...
2º elemento + (3º+4º+5º+6º)
2º elemento + (3º+4º+5º+7º)

Y así sucesivamente con todos. La forma de recorrer los bucles me sobrepasa. He intentado hacerlo con 3 bucles pero no me aclaro.

Gracias por leerme.

Esto es lo que llevo hasta el momento.

Código C++:
Ver original
  1. /* Inclusion de archivos de cabecera */
  2. #include <iostream>
  3. #include <conio.h>
  4. #include <cstdlib>
  5. #include <math.h>
  6. #include <cstdio>
  7. #include <cstring>
  8.  
  9. using namespace std;
  10. /* Cabeceras de nuestras propias funciones */
  11.  
  12. /* Programa principal */
  13. int main (){
  14.     /* Declaración de variables auxiliares*/
  15.     float Temp;
  16.     int i;
  17.     int j;
  18.  
  19.     /* Declaracion de variables contadoras */
  20.  
  21.     /* Declaración de variables principales */
  22.     float Slots[10]={1000,1200,1400,1600,1800,2000,2200,2400,2600,2800};
  23.     float Porcentajes[10];
  24.     float Equipo1[5];
  25.     float Equipo2[5];
  26.     float Suma1;
  27.     float Suma2;
  28.     float SumaTotal;
  29.  
  30.     /* Inicialización de variables */
  31.     Suma1=0;
  32.     Suma2=0;
  33.     SumaTotal=0;
  34.  
  35.     /* Entrada de datos */
  36.  
  37.  
  38.     /* Procesamiento de datos */
  39.     for (i=0; i<10-1; i++){
  40.         for (j=i+1; j<10; j++){
  41.             if (Slots[i] < Slots[j]){
  42.                 Temp = Slots[i];
  43.                 Slots[i] = Slots[j];
  44.                 Slots[j] = Temp;
  45.             }
  46.         }
  47.     }
  48.  
  49.     for (i=0; i<10; i++){
  50.         SumaTotal=SumaTotal+Slots[i];
  51.     }
  52.  
  53.     for (i=0; i<10; i++){
  54.         Porcentajes[i]=(Slots[i]/SumaTotal)*100;
  55.         cout<<Slots[i]<<" es el "<<Porcentajes[i]<<"% de "<<SumaTotal<<endl;
  56.     }
  57.  
  58.  
  59.     /* Salida de resultados */
  60.     cout<<"Suma Total: "<<SumaTotal;
  61.  
  62.  
  63.     getch ();
  64.  
  65.     /* Fin de la aplicacion (entorno MS-DOS) */
  66.     return 0;
  67. }