Muy buenas a todos! Me ha surgido un problema con un código y esperaba que alguien me pudiera ayudar con esto.
A ver, el objetivo es programar un cajero automático, como el de los bancos. A partir de una cantidad introducida por el usuario, éste la devuelve con el menor número de billetes posible. El problema surge al cambiar la disponibilidad de ciertas cantidades (por ejemplo, que de todo tipo de billetes salvo de 200€).
No encuentro una forma de expresar ésto de forma matemática. Por el momento, esto es lo que tengo:
<?
$x=0;
$n=$_POST['cantidad'];
if($_POST['500']==true){$x=$x+1;$moneda[$x]='B500';$valor[$x]=500;}
if($_POST['200']==true){$x=$x+1;$moneda[$x]='B200';$valor[$x]=200;}
if($_POST['100']==true){$x=$x+1;$moneda[$x]='B100';$valor[$x]=100;}
if($_POST['50']==true){$x=$x+1;$moneda[$x]='B50';$valor[$x]=50;}
if($_POST['20']==true){$x=$x+1;$moneda[$x]='B20';$valor[$x]=20;}
if($_POST['10']==true){$x=$x+1;$moneda[$x]='B10';$valor[$x]=10;}
for ($p=1;$p<=$x;$p=$p+1)
{while ($valor[$p]<=$n)
{$cambio[$p]=$cambio[$p]+1;
$n=$n-$valor[$p];
}
}
for ($p=1;$p<=$x;$p=$p+1) {print $moneda[$p] ; print ":"; print $cambio[$p];print "---";}
?>
dónde $n es la cantidad a entregar y $cambio, la cantidad de cada billete.
Muchas gracias por vuestro tiempo y si alguien cuenta con una solución, aunque sea pseudocódigo, me será de mucha ayuda.
Pseudo código
No se PHP, solo C++, Java y algo de Python, así que no te puedo ayudar diréctamente en PHP. Sin embargo el algoritmo es muy sencillo:
Al final, te podrían sobrar, por ejemplo, 4 euros, que no se pueden pagar con billetes. Por eso es lo del while(n>5) y no while(n!=0).
No se si te he ayudado. Espero que sí.
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Gracias, pero de hecho, el
Gracias, pero de hecho, el algoritmo que me presentas es muy similar al que escribi en el post. El fallo en ambos viene en casos como el siguiente:
billetes={200, 50, 20}
n=210
Como podras comprobar, en un caso como el anterior, cuya respuesta seria 3x50 + 3x20, el programa responde 1x200, y los 10 de resto desaparecen.
Gracias por tu atención y tiempo de todos modos ;)
No había caido.
Pues no lo había pensado, pero tienes razón. Para sacarlo hay que complicarse un poco más la vida con recursividad y tal. Te lo pongo en python porque es como lo he escrito. Esta vez no lo he hecho de cabeza, así que me he asegurado que funciona:
Para 210 me devolvería [50, 50, 50, 20, 20, 20]
No creo que tengas mucho problema en entender el código, aunque no sepas python. Es bastante simple (de hecho yo hace unas semanas no sabía nada).
Saludos
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Me voy a tomar mi tiempo para
Me voy a tomar mi tiempo para analizar el código y traducir-lo a PHP. Gracias por tu respuesta y perdón por la demora, estos dias estoy un poco ocupado con los exámenes.