martes, 29 de enero de 2013

El problema de la Mochila


El problema de la mochila lo enunciaria de forma mas didactica con el siguiente ejemplo:
Supongamos que somos ladrones y hemos entrado en la casa de un rico,  tenemos un saco que tiene un determinada capacidad de volumen  ;) , entonces encontramos diferentes objetos con un valor y volumen determinado, entonces surge la pregunta ¿Cuales nos conviene llevar?
 //...
 static int mochila( int capacidad, int n , int [ ] peso, int [ ] utilidad  ) {
  
  int NUMERO_DE_ELEMENTOS =  n;
  int W = capacidad;
  int [ ][ ] dp = new int[ NUMERO_DE_ELEMENTOS + 1 ][ W + 1 ];
  
  for (int j = 0; j < W + 1 ; ++j)
   dp[ 0 ][ j ] = 0;
  for (int i = 0; i < NUMERO_DE_ELEMENTOS + 1 ; ++i)
   dp[ i ][ 0 ] = 0;
    
  for (int i = 1; i < NUMERO_DE_ELEMENTOS + 1; ++i ) {
   for (int w = 1; w < W + 1; ++w ) {
    if ( w - peso[ i ] <  0 )
     dp[ i ][ w ] = dp[ i - 1 ][ w ];
    else // if ( w - peso[ i ] >=  0 )
     dp[ i ][ w ] = Math.max( dp[ i - 1 ][ w ], 
                          utilidad[ i ] + dp[ i - 1 ][  w - peso[ i ] ] ) ;  
   } 
  }
  return dp[ NUMERO_DE_ELEMENTOS ][ W ]; 
 }
 public static void main(String[] args) {
  int n, capacidad;
  Scanner cin = new Scanner(System.in);
  System.out.printf("INGRESE EL NUMERO DE LOS ELEMENTOS:");
  n = cin.nextInt();
  int [ ] peso = new int[ n + 1];
  int [ ] utilidad = new int[ n + 1];
  System.out.printf("INGRESE LOS PESOS DE LOS ELEMENTOS:");
  for(int i=1; i < n + 1; ++i)
   peso[ i ] = cin.nextInt();
  System.out.printf("INGRESE LA UTILIDAD DE LOS ELEMENTOS:");
  for(int i=1; i < n + 1; ++i)
   utilidad[ i ] = cin.nextInt();
  System.out.printf("INGRESE LA CAPACIDAD DE LA MOCHILA:");
  capacidad = cin.nextInt();
  System.out.println( mochila(capacidad , n, peso, utilidad) );
  return ;
  
 } 
 //...

La complejidad es O(n * W), donde n es el número total de elementos y W es el peso máximo.
PD: encontré el siguiente blog que me ayudo a resaltar mi código:
http://patrickwebster.blogspot.com/2009/02/syntaxhighlighter-in-blogger.html
Otras referencias para resaltar codigo:
http://sistemasolutions.blogspot.com/2009/08/codigo-fuente-en-tu-blog_23.html
http://tamanmohamed.blogspot.com/2012/02/blog-how-to-professionally-highlight.html