微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

投币自动售票程序

题目:投币自动售票程序
要求: 找钱原则“有大面值的货币就不找小面试的货币”

例如:当售票机中有10c=>1,20c=>3,50c=>1。需要找60c,这个时候就要找1个50c的和1个10c的硬币,而不是3个20c的硬币。
再比如,当售票机中有5c=>1,50c=>1,100c($1) => 1,需要找160c,这个时候也需要能正确找钱。
说的简单点,就是有个函数,你提供要找的钱当参数,返回值就是找出来的钱(例如:一个数组)。

此题是澳大利亚研究生课程中.NET Programming课的结课作业
解题原理:
使用了递归
1.若是要找160的话
2.有100的话,先找100
3.这时需要找的就剩下60了,这时调用递归
4.递归第一次先找回50,剩下10,再找回5,发现最后还剩下5,找钱失败,这时回滚。
5.递归第二次先找回20,剩下40,再找回20,剩下20,再找回20,剩下0,返回成功
6.输出

 

 
 
  1. #例如:当售票机中有10c=>1, 20c=>3, 50c=>1。需要找60c,这个时候就要找1个50c的和1个10c的硬币,而不是3个20c的硬币。  
  2.  
  3. #再比如,当售票机中有5c=>1, 50c=>1, 100c($1) => 1,需要找160c,这个时候也需要能正确找钱。  
  4.  
  5. #说的简单点,就是有个函数,你提供要找的钱当参数,返回值就是找出来的钱(例如:一个数组)。  
  6.  
  7. #所有的币值列表  
  8.  
  9. @coins=( 100,50,20,10,5,2,1);  
  10. #每个币值对应的个数  
  11.  
  12. @coinnums=( 1, 1, 2, 0,3,0);  
  13.  
  14. #每个币值对应的个数  
  15.  
  16. @paybackCoins=();  
  17. $paybackTotal=160;  
  18. if(payback($paybackTotal)==0){  
  19.     print join(",",@paybackCoins)."\n";  
  20. }else{  
  21.     print "payback $paybackTotal fail\n";  
  22. }  
  23.  
  24. @coins=( 100,1);  
  25. @coinnums=( 0, 3,0);  
  26. @paybackCoins=();  
  27. $paybackTotal=60;  
  28. if(payback($paybackTotal)==0){  
  29.     print join(",@paybackCoins)."\n";  
  30. }else{  
  31.     print "payback $paybackTotal fail\n";  
  32. }  
  33.  
  34. @paybackCoins=();  
  35. $paybackTotal=55;  
  36. if(payback($paybackTotal)==0){  
  37.     print join(",@paybackCoins)."\n";  
  38. }else{  
  39.     print "payback $paybackTotal fail\n";  
  40. }  
  41.  
  42. sub payback{  
  43.     my $payback=shift;  
  44.     $coinslen=scalar(@coins);  
  45.     my $i=0;  
  46.     for($i=0;$i<$coinslen;$i++){  
  47.             if($coinnums[$i]>0){  
  48.                 my $coin=$coins[$i];  
  49.                   
  50. #                每次都从最大币值开始循环  
  51.  
  52.                 if($payback >= $coin){  
  53.                     push(@paybackCoins,$coin);  
  54.                     $payback-=$coin;  
  55.                     $coinnums[$i]--;  
  56.                     if($payback<=0){  
  57. #                        剩下0时返回  
  58.  
  59.                         return 0;  
  60.                     }  
  61. #                    继续找剩下的钱  
  62.  
  63.                     if(payback($payback)!=0){  
  64. #                        剩下的钱找不完时,回滚  
  65.  
  66.                         $rollbackCoin=pop(@paybackCoins);      
  67.                         $coinnums[$i]++;  
  68.                         $payback+=$rollbackCoin;  
  69.                     }else{  
  70. #                        剩下的钱找完时,返回  
  71.  
  72.                         return 0;      
  73.                     }  
  74.                 }  
  75.             }  
  76.         }  
  77.     return 1;  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐