Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Igualar un array en dos

Estas en el tema de Igualar un array en dos en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 31/01/2012, 06:08
 
Fecha de Ingreso: enero-2012
Ubicación: En españa dije...
Mensajes: 28
Antigüedad: 12 años, 2 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. }
  #2 (permalink)  
Antiguo 03/02/2012, 00:31
Avatar de Jorge__  
Fecha de Ingreso: enero-2012
Mensajes: 29
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Igualar un array en dos

Hola, amigo estuve toda la tarde intentando ayudarte pero no lo pude lograr, lo que estas tratando de hacer se llama "Combinatoria" y es algo muy complejo, para que te tengas una idea se utiliza en aplicaciones de ajedrez.

Tal vez, si explicaras el trasfondo de todo podriamos encontrar una forma mas sencilla.

De cualquier modo le seguire intentando un par de horas mas haber que logro.
  #3 (permalink)  
Antiguo 04/02/2012, 03:42
 
Fecha de Ingreso: enero-2012
Ubicación: En españa dije...
Mensajes: 28
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: Igualar un array en dos

Hola, gracias por contestarme. Ya estuve mirando sobre combinaciones y ya he conseguido resolverlo.


He aqui un ejemplo con 10.

Los array Locked son las personas que quiero que estén a la fuerza en un equipo.

Código C++:
Ver original
  1. /* Nombre del programa: */
  2. /* Descripción del programa: */
  3. /* Restricción de datos de entrada: */
  4. /* Fecha de creación: */
  5. /* Versión: */
  6.  
  7. /* Inclusion de archivos de cabecera */
  8. #include <iostream>
  9. #include <conio.h>
  10. #include <cstdlib>
  11. #include <math.h>
  12. #include <cstdio>
  13. #include <cstring>
  14.  
  15. using namespace std;
  16.  
  17. /* Cabeceras de nuestras propias funciones */
  18.  
  19. /* Programa principal */
  20. int main (){
  21.     /* Declaración de variables auxiliares*/
  22.     int i,j,k,l,n;
  23.     int s;
  24.     int x;
  25.     float STeam1;
  26.     float STeam2;
  27.     int TamLock1;
  28.     int TamLock2;
  29.  
  30.     /* Declaracion de variables contadoras */
  31.  
  32.     /* Declaración de variables principales */
  33.     float Slots[10]={1500,1653,1507,1506,1518,1556,1707,1680,1558,1597};  //Array with players' points.
  34.     int Locked1[5]={0,-1,-1,-1,-1}; //Players locked on team 1.
  35.     int Locked2[5]={6,7,-1,-1,-1}; //Players locked on team 2.
  36.     float Porcentajes[10]; //Array with the percentages of the players.
  37.     float Equipo1[5]; //Team 1 points.
  38.     float Equipo2[5]; //Team 2 points.
  39.     float Suma1; //Here it will be added 5 players to calculate the best error.
  40.     float SumaTotal; //All points.
  41.     float Error; //Currently error.
  42.     float ErrorFinal=100; //Final Error (The best error).
  43.     int p1[5]; //Pointer of players selected to be in team 1.
  44.     int p2[5]; //... team 2.
  45.     bool Existen; //Just to help getting "p2[]" values.
  46.     bool Verdad;
  47.  
  48.     /* Inicialización de variables */
  49.     Suma1=0;
  50.     SumaTotal=0;
  51.     STeam1=0;
  52.     STeam2=0;
  53.     TamLock1=0;
  54.     TamLock2=0;
  55.     s=1;
  56.     x=0;
  57.     k=s;
  58.  
  59.     /* Input */
  60.  
  61.     /* Procesamiento de datos */
  62.  
  63.  
  64.     /*Size of Locked Arrays*/
  65.     for(int h=0; h<5; h++){
  66.         if(Locked1[h]!=-1){
  67.             TamLock1++;
  68.         }
  69.     }
  70.     for(int h=0; h<5; h++){
  71.         if(Locked2[h]!=-1){
  72.             TamLock2++;
  73.         }
  74.     }
  75.     /*En of Size of Arrays*/
  76.  
  77.     /*Total points*/
  78.     for (i=0; i<10; i++){
  79.         SumaTotal=SumaTotal+Slots[i];
  80.     }
  81.  
  82.     /*Percentages per person*/
  83.     for (i=0; i<10; i++){
  84.         Porcentajes[i]=(Slots[i]/SumaTotal)*100;
  85.     }
  86.  
  87.  
  88.     /* BALANCE ALGORITHM*/
  89.     int m=0;
  90.     for(i=0; i<10; i++){
  91.         for(j=i+1; j<10; j++){
  92.             for(k=j+1; k<10; k++){
  93.                 for(l=k+1; l<10; l++){
  94.                     for(n=l+1; n<10; n++){
  95.                         Verdad=true;
  96.                         for(int h=0; h<TamLock2; h++){
  97.                             if(i==Locked2[h]){
  98.                                 Verdad=false;
  99.                             }
  100.                         }
  101.                         if(Verdad==true){
  102.                             Verdad=true;
  103.                             for(int h=0; h<TamLock2; h++){
  104.                                 if(j==Locked2[h]){
  105.                                     Verdad=false;
  106.                                 }
  107.                             }
  108.                             if(Verdad==true){
  109.                                 Verdad=true;
  110.                                 for(int h=0; h<TamLock2; h++){
  111.                                     if(k==Locked2[h]){
  112.                                         Verdad=false;
  113.                                     }
  114.                                 }
  115.                                 if(Verdad==true){
  116.                                     Verdad=true;
  117.                                     for(int h=0; h<TamLock2; h++){
  118.                                         if(l==Locked2[h]){
  119.                                             Verdad=false;
  120.                                         }
  121.                                     }
  122.                                     if(Verdad==true){
  123.                                         Verdad=true;
  124.                                         for(int h=0; h<TamLock2; h++){
  125.                                             if(n==Locked2[h]){
  126.                                                 Verdad=false;
  127.                                             }
  128.                                         }
  129.                                         if(Verdad==true){
  130.                                             Verdad=false;
  131.                                             for(int h=0; h<TamLock1; h++){
  132.                                                 if(i==Locked1[h] || j==Locked1[h] || k==Locked1[h] || l==Locked1[h] || n==Locked1[h]){
  133.                                                     Verdad=true;
  134.                                                 }
  135.                                             }
  136.                                             if(Verdad==true){
  137.                                                 Suma1=Porcentajes[i]+Porcentajes[j]+Porcentajes[k]+Porcentajes[l]+Porcentajes[n];
  138.                                                 Error=Suma1-50;
  139.                                                 if(Error<0){
  140.                                                     Error=Error*-1;
  141.                                                 }
  142.                                                 if(Error<ErrorFinal){
  143.                                                     ErrorFinal=Error;
  144.                                                     p1[0]=i;
  145.                                                     p1[1]=j;
  146.                                                     p1[2]=k;
  147.                                                     p1[3]=l;
  148.                                                     p1[4]=n;
  149.                                                 }
  150.                                                 m++;
  151.                                             }
  152.                                         }
  153.                                     }
  154.                                 }
  155.                             }
  156.                         }
  157.                     }
  158.                 }
  159.             }
  160.         }
  161.     }
  162.  
  163.     for(int h=0; h<10; h++){
  164.         Existen=false;
  165.         for(int c=0; c<5; c++){
  166.             if(h==p1[c]){
  167.                 Existen=true;
  168.             }
  169.         }
  170.         if(Existen==false){
  171.             p2[x]=h;
  172.             x++;
  173.         }
  174.     }
  175.  
  176.     for(int h=0; h<5; h++){
  177.         Equipo1[h]=Slots[p1[h]];
  178.     }
  179.  
  180.     for(int h=0; h<5; h++){
  181.         Equipo2[h]=Slots[p2[h]];
  182.     }
  183.  
  184.  
  185.  
  186.     /* Output */
  187.     for (i=0; i<10; i++){
  188.         cout<<Slots[i]<<" is "<<Porcentajes[i]<<"% of "<<SumaTotal<<endl;
  189.     }
  190.     cout<<"Combinations: "<<m<<endl;
  191.     cout<<"Best Error: "<<ErrorFinal<<endl<<endl;
  192.     cout<<"Total points: "<<SumaTotal<<endl<<endl;
  193.  
  194.     cout<<"Team 1"<<endl;
  195.     for(int h=0; h<5; h++){
  196.         cout<<Equipo1[h]<<endl;
  197.         STeam1=STeam1+Equipo1[h];
  198.     }
  199.     cout<<"Team 1 Points: "<<STeam1<<endl;
  200.     cout<<"Average team 1: "<<STeam1/5<<endl;
  201.  
  202.     cout<<"\nTeam 2"<<endl;
  203.     for(int h=0; h<5; h++){
  204.         cout<<Equipo2[h]<<endl;
  205.         STeam2=STeam2+Equipo2[h];
  206.     }
  207.     cout<<"Team 2 Points: "<<STeam2<<endl;
  208.     cout<<"Average team 2: "<<STeam2/5<<endl;
  209.  
  210.  
  211.     getch ();
  212.  
  213.     /* Fin de la aplicacion (entorno MS-DOS) */
  214.     return 0;
  215. }
  216.  
  217. /* Implementacion de mis funciones o procedimientos */
  218.  
  219. /***********************************************
  220.     Función X
  221.     Descripción:
  222. ************************************************/
  223. // Solución de la función o procedimiento

Etiquetas: igualar, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 20:56.