投币自动售票程序

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

例如:当售票机中有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.  
  3. #再比如,当售票机中有5c=>1, 20c=>3, 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,5,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,50,20,10,5,2,1);  
  25. @coinnums=( 0, 1, 3, 1,0,0,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;  

      本文转自yifangyou 51CTO博客,原文链接:http://blog.51cto.com/yifangyou/605765,如需转载请自行联系原作者



相关文章
|
16天前
|
Java
使用CountDownLatch模拟王者荣耀玩家进度加载
使用CountDownLatch模拟王者荣耀玩家进度加载
|
4月前
在程序运行过程中,线程的状态是什么?进来看看就通透了
在程序运行过程中,线程的状态是什么?进来看看就通透了
32 0
|
7月前
|
Python
一个12306自动抢票的脚本
一个12306自动抢票的脚本
438 1
|
Android开发 芯片
RK3399平台开发系列讲解(系统修改记录篇)1.17、Android系统永不休眠修改步骤(一般是为了开发便利)
RK3399平台开发系列讲解(系统修改记录篇)1.17、Android系统永不休眠修改步骤(一般是为了开发便利)
113 0
RK3399平台开发系列讲解(系统修改记录篇)1.17、Android系统永不休眠修改步骤(一般是为了开发便利)
|
Web App开发 小程序 开发者
三分钟创建一个小程序-每天三分钟玩转小程序 1
三分钟创建一个小程序-每天三分钟玩转小程序 1
三分钟创建一个小程序-每天三分钟玩转小程序 1
|
Java
使用java多线程模拟一个售票系统
1.基于继承Thread实现 代码实现:
158 0
|
Java
编写Java程序,车站只剩 50 张从武汉到北京的车票,现有 3 个窗口售卖,用程序模拟售票的过程,使用Runnable解决线程安全问题
编写Java程序,车站只剩 50 张从武汉到北京的车票,现有 3 个窗口售卖,用程序模拟售票的过程,使用Runnable解决线程安全问题
212 0
编写Java程序,车站只剩 50 张从武汉到北京的车票,现有 3 个窗口售卖,用程序模拟售票的过程,使用Runnable解决线程安全问题
|
Java
编写Java程序,车站只剩 50 张从武汉到北京的车票,现有 3 个窗口售卖,用程序模拟售票的过程
编写Java程序,车站只剩 50 张从武汉到北京的车票,现有 3 个窗口售卖,用程序模拟售票的过程
210 0
编写Java程序,车站只剩 50 张从武汉到北京的车票,现有 3 个窗口售卖,用程序模拟售票的过程
|
C# Windows
用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠
原文:用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠 简介 本文讲述了用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠。 如何实现 首先,使用 using 语句添加我们需要的命名空间: using System.
3319 0
|
Java
线程的控制之守护线程_坦克大战帮助理解
后台线程   public final void setDaemon(boolean on)   将该线程标记为守护线程或用户线程     对象名.setDaemon(true); // 设置守护线程     当正在运行的线程都是守护线程时,Java虚拟机退出。
1330 0