Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4218204
  • 博文数量: 291
  • 博客积分: 8003
  • 博客等级: 大校
  • 技术积分: 4275
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-30 18:28
文章分类

全部博文(291)

文章存档

2017年(1)

2013年(47)

2012年(115)

2011年(121)

2010年(7)

分类: Python/Ruby

2011-03-28 12:01:21

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

例如:当售票机中有10c=>1, 20c=>3, 50c=>1。需要找60c,这个时候就要找1个50c的和1个10c的硬币,而不是3个20c的硬币。
再比如,当售票机中有5c=>1, 20c=>3, 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. #再比如,当售票机中有5c=>1, 20c=>3, 50c=>1, 100c($1) => 1,需要找160c,这个时候也需要能正确找钱。

  3. #说的简单点,就是有个函数,你提供要找的钱当参数,返回值就是找出来的钱(例如:一个数组)。

  4. #所有的币值列表

  5. @coins=( 100,50,20,10,5,2,1);
  6. #每个币值对应的个数

  7. @coinnums=( 1, 1, 2, 0,3,5,0);

  8. #每个币值对应的个数

  9. @paybackCoins=();
  10. $paybackTotal=160;
  11. if(payback($paybackTotal)==0){
  12.     print join(",",@paybackCoins)."\n";
  13. }else{
  14.     print "payback $paybackTotal fail\n";
  15. }

  16. @coins=( 100,50,20,10,5,2,1);
  17. @coinnums=( 0, 1, 3, 1,0,0,0);
  18. @paybackCoins=();
  19. $paybackTotal=60;
  20. if(payback($paybackTotal)==0){
  21.     print join(",",@paybackCoins)."\n";
  22. }else{
  23.     print "payback $paybackTotal fail\n";
  24. }

  25. @paybackCoins=();
  26. $paybackTotal=55;
  27. if(payback($paybackTotal)==0){
  28.     print join(",",@paybackCoins)."\n";
  29. }else{
  30.     print "payback $paybackTotal fail\n";
  31. }

  32. sub payback{
  33.     my $payback=shift;
  34.     $coinslen=scalar(@coins);
  35.     my $i=0;
  36.     for($i=0;$i<$coinslen;$i++){
  37.             if($coinnums[$i]>0){
  38.                 my $coin=$coins[$i];
  39.                 
  40. #                每次都从最大币值开始循环

  41.                 if($payback >= $coin){
  42.                     push(@paybackCoins,$coin);
  43.                     $payback-=$coin;
  44.                     $coinnums[$i]--;
  45.                     if($payback<=0){
  46. #                        剩下0时返回

  47.                         return 0;
  48.                     }
  49. #                    继续找剩下的钱

  50.                     if(payback($payback)!=0){
  51. #                        剩下的钱找不完时,回滚

  52.                         $rollbackCoin=pop(@paybackCoins);    
  53.                         $coinnums[$i]++;
  54.                         $payback+=$rollbackCoin;
  55.                     }else{
  56. #                        剩下的钱找完时,返回

  57.                         return 0;    
  58.                     }
  59.                 }
  60.             }
  61.         }
  62.     return 1;
  63. }
阅读(3500) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~