、售票员售票,票价5元一张,假设只有5元,10元,20元,50元和100元五种币种,售票员手上有若干钱(自己初始化),顾客会拿这一张(5元,10元,20元,50元中的一张)钱来购票,设计一个算法,根据
时间: 2024-03-18 16:22:36 浏览: 32
顾客支付的钱数和售票员手上的钱数,计算出找零的最小钱数。
我的理解是,假设售票员手上有的钱数是固定的,我的算法应该可以计算出在售票员手上的钱数不变的情况下,每种顾客支付的钱数对应的最小找零钱数。如果理解有误,请及时纠正。
我们可以使用贪心算法来解决这个问题。具体地,我们从最大面值的钱数开始考虑,如果当前钱数比剩余需要找零的钱数大,那么就优先使用当前面值的钱数进行找零。如果当前面值的钱数不够找零,我们就选择下一个面值的钱数。重复这个过程直到找零钱数为0为止。
下面是代码实现:
相关问题
买火车票时经常会碰到找钱问题。售票员手中有50、20、10、5、1元的钱币,你知道怎么找钱才能使找回的零钱张数最少吗?
这个问题可以通过找零来解决。售票员手中有50、20、10、5、1元各一枚的硬币,所以找回每位顾客的零钱张数是不同的。如果票价是50元,那么就不需要找零;如果票价是20元,找回一张10元和一张5元的硬币;如果票价是10元,找回一张5元和一张1元的硬币;如果票价是5元,找回一张1元的硬币;如果票价是1元,则无需找零。因此,最少需要找回的零钱张数为两张,即一张10元和一张5元的硬币。
java编程模拟3个人卖票。张三、李四和赵五买电影票,售票元只有3张5元的人民币,电影票5元一张。张三拿一张20元的人民币排在李四的前面买票,李四拿一张10元的人民币排在赵五前面买票,赵五拿一张5元的人民币买票。
好的,以下是模拟3个人卖票的Java程序:
```
class TicketSeller {
private int money; // 售票员手里的钱
private int tickets; // 售票员手里的票数
public TicketSeller(int money, int tickets) {
this.money = money;
this.tickets = tickets;
}
public synchronized boolean sellTicket(String name, int price) {
if (price > money || tickets <= 0) {
return false; // 售票失败
}
System.out.println(name + "买了一张票,花费" + price + "元");
money -= price;
tickets--;
return true; // 售票成功
}
}
class Person implements Runnable {
private String name; // 人名
private int money; // 拿的钱
private int price; // 花费
private TicketSeller seller; // 售票员
public Person(String name, int money, int price, TicketSeller seller) {
this.name = name;
this.money = money;
this.price = price;
this.seller = seller;
}
public void run() {
if (seller.sellTicket(name, price)) {
System.out.println(name + "买票成功");
} else {
System.out.println(name + "买票失败");
}
}
}
public class Test {
public static void main(String[] args) {
TicketSeller seller = new TicketSeller(15, 3);
Person p1 = new Person("张三", 20, 5, seller);
Person p2 = new Person("李四", 10, 5, seller);
Person p3 = new Person("赵五", 5, 5, seller);
Thread t1 = new Thread(p1);
Thread t2 = new Thread(p2);
Thread t3 = new Thread(p3);
t1.start();
t2.start();
t3.start();
}
}
```
运行结果:
```
张三买了一张票,花费5元
张三买票成功
李四买了一张票,花费5元
李四买票成功
赵五买了一张票,花费5元
赵五买票成功
```
在这个程序中,售票员类TicketSeller是线程安全的,因为它对售票和钱数的操作都使用了synchronized关键字进行同步,避免了多个人同时修改数据的问题。三个人类Person是线程类,使用了Runnable接口实现run方法,每个人拿着所需的钱和价格,调用售票员的sellTicket方法进行购票。在main方法中创建三个线程,分别代表三个人,开启线程后,售票员会根据每个人所拿的钱和价格进行售票,售票成功则输出成功信息,失败则输出失败信息。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)