Autor Tema: Algoritmo voraz de la mochila Error ArrayIndexOutOfBoundsException Java  (Leído 4583 veces)

Hiriox

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Tengo el siguiente algoritmo devorador y me salta error del tipo que puse en el titulo y no entiendo por que. A ver si alguien puede echarme una mano :D

Código: [Seleccionar]
public class MochilaOptima
{
static int m;         // capacidad mochila
static String[]nombre;// nombre elemento
static int[]peso;     // peso elemento
static int[]beneficio;// beneficio/kg de cada elemento

public static void main (String arg [] )
{
int m= Integer.parseInt(arg[750]);

int n=8; // número elementos
nombre=new String[n];
nombre[0]="Hierro";nombre[1]="Carbon";nombre[2]="Cobre";
nombre[3]="Zinc";nombre[4]="Plomo";nombre[5]="Niquel";
nombre[6]="Platino";nombre[7]="Aluminio";

beneficio=new int[n];
// SE SUPONE YA ORDENADO DECRECIENTEMENTE POR BENEFICIO
beneficio[0]=90;beneficio[1]=85;beneficio[2]=82;beneficio[3]=80;
beneficio[4]=70;beneficio[5]=68;beneficio[6]=65;beneficio[7]=60;

peso=new int[n];
peso[0]=45;peso[1]=30;peso[2]=25;peso[3]=60;
peso[4]=50;peso[5]=40;peso[6]=80;peso[7]=600;

System.out.println ("CAPACIDAD DE LA MOCHILA= "+m+" Toneladas");
System.out.println ("SE CARGA LO SIGUIENTE:");

int valorMochila= resolverMochila();

System.out.println ();
System.out.println ("BENEFICIO DE LA CARGA= "+valorMochila+" Euros");

System.out.println ();
System.out.println ("CARGA SIEMPRE OPTIMA");
}

static void mostrarElementos()
{
System.out.print("Mineral: ");
for (int i= 0; i<nombre.length; i++)
{
System.out.print(nombre);
}

}

static int resolverMochila ()
/* este método es de complejidad lineal con el número de
elementos que se carguen, que nunca es mayor que n */
{
int n=peso.length;
int valor=0;
int cabe=m;
int indice=0;
while (m>0 && indice<n )
{
if (cabe>=peso[indice] ) //cabe entero
{
System.out.println (nombre[indice]+ "  SE GARGA "+peso[indice]+" Toneladas");
valor=valor+peso[indice]*beneficio[indice];
cabe=cabe-peso[indice];
indice++;
}   
else  // no cabe entero
{
System.out.println (nombre[indice]+ "  SE GARGA "+cabe+" Toneladas");
valor=valor+cabe*beneficio[indice];
cabe=0;
indice++;
}
}
System.out.println("SE HAN CARGADO UN TOTAL DE "+(m-cabe)+" Toneladas");
return valor;
}
}  // FIN

« Última modificación: 17 de Abril 2015, 10:28 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Hola no entiendo qué significado tiene esta línea:

int m= Integer.parseInt(arg[750]);

arg es un array o arreglo de elementos String, parámetros que se pueden pasar al método main para que se ejecute conforme a esos argumentos.

¿Pero cuál es el argumento 750?

Parece que m es la capacidad de la mochila, con lo cual lo lógico es que simplemente tengamos

int m = 750;

Que significaría que la mochila tiene una capacidad de 750 toneladas (ya es una mochila grande...).


Aparte de eso tienes un problema aquí:

Código: [Seleccionar]
static int resolverMochila ()
/* este método es de complejidad lineal con el número de
elementos que se carguen, que nunca es mayor que n */
{
int n=peso.length;
int valor=0;
int cabe=m;
int indice=0;
while (m>0 && indice<n )


En este método m hace referencia a m como variable global (static int m;) de modo que m no tiene ningún valor inicial, m vale cero como variable global y por tanto no llega a entrar en el while porque m no es mayor que cero.

¿Por qué defines m como atributo de clase o variable global y luego la vuelves a definir dentro del método main?

Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".