Ver Mensaje Individual
  #2 (permalink)  
Antiguo 12/03/2011, 21:36
Avatar de Ronruby
Ronruby
 
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 16 años, 4 meses
Puntos: 416
Respuesta: programa para una cajera de banco

Hmmmm ... Tengo un algoritmo rondando por ahi para eso mismo. Greedy Algorithm.
Lo busque pero no lo encontre ... bueno, la idea es hacer uso del operando % que significa modulus, el restante de una division.

¿Como usarlo?
NOTA: EL CODIGO ES EN PHP, PERO ES FACIL PASARLO A JAVA (CREI QUE HABIA POSTEADO ESTO EN PHP)
Código PHP:
Ver original
  1. Digamos que el usuario solicita 1460, haces:
  2. $billetes100 = $cantidad%100; // devolvera 14
  3. $cantidad = $cantidad - ($billetes100*100);
  4. $billetes50 = $cantidad%50; //devuelve 1
  5. $cantidad = $cantidad - ($billetes50*50);
  6. $billetes20 = $cantidad%20; //devuelve 0
  7. $cantidad = $cantidad - ($billetes20*20);
  8. $billetes10 = $cantidad%10; //devuelve 1

Total: 14 billetes de 100, 1 de 50, 1 de 10.

Ahora bien, asi como te lo mostre es un ejemplo. La forma en que lo implemente fue poniendo las papeletas en un array y use un bucle while para hacerlo mas "automatizado" y "bonito" el codigo.

EDIT: Lo encontre rondando en mi correo, obvia las partes que no son necesarias:
Código PHP:
Ver original
  1. <?php
  2.  
  3. function greedyAlgorithm($cantidad, $papeletas = null) {
  4.     $resto = $cantidad;
  5.     $i = 0;
  6.    
  7.     while($resto != 0) {
  8.         $nuevas[$papeletas[$i]] = floor($resto/$papeletas[$i]);
  9.         $resto %= $papeletas[$i];
  10.         $i++;
  11.     }
  12.    
  13.     return $nuevas;
  14. }
  15.  
  16. $nuevas = greedyAlgorithm(1460, array(100,50,20,10));
  17.  
  18. echo '<pre>';
  19. var_dump($nuevas);
  20. echo '</pre>';
  21.  
  22. ?>

Resultado:
Cita:
array(4) {
[100]=>
float(14)
[50]=>
float(1)
[20]=>
float(0)
[10]=>
float(1)
}

Última edición por Ronruby; 12/03/2011 a las 22:03