假设商店货品价格都不大于100元(且为整数),若顾客付款在100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。 假定此商店的货币面值只包括:50元、20元、 10元、 5元、2元、1元 六种。 编写完程序
时间: 2023-12-03 12:47:20 浏览: 124
以下是一个 Python 的实现:
```python
def change(amount):
denominations = [50, 20, 10, 5, 2, 1]
result = []
for d in denominations:
while amount >= d:
result.append(d)
amount -= d
return result
amount = int(input("请输入付款金额:"))
change_list = change(100 - amount)
print("找零钱的最佳组合为:", change_list)
print("需要找零钱的张数为:", len(change_list))
```
这个程序中,我们定义了一个 `change` 函数,它接受一个付款金额 `amount`,并返回找零钱的最佳组合。在函数中,我们先定义了货币面值列表 `denominations`,然后从大到小枚举每种面值,尽可能地多找当前面值的钱,直到找完为止。
在主程序中,我们首先读入顾客的付款金额,然后调用 `change` 函数计算出找零钱的最佳组合,并输出结果。注意,我们这里计算的是找零钱的张数,而不是面值总额。
相关问题
假设商店货品价格都不大于100元(且为整数) , 若顾客付款在100元内, 现有一个程序能在每位顾客付款后给出找零钱的最佳组合( 找给顾客货币张数最少)。假定此商店的货币面值只包括: 50元、 20元、10元、 5元、 2
元、1元。请问如何设计一个程序来实现这个功能?
首先,我们可以将所有的货币面值存入一个数组中,例如:
```
int[] coins = {50, 20, 10, 5, 2, 1};
```
然后,对于每一个顾客的付款金额,我们可以通过以下的贪心算法来计算最少的找零钱张数:
1. 初始化一个空的记录找零钱张数的数组 change。
2. 对于每一个货币面值 coin,循环执行以下步骤:
1. 计算当前面值 coin 可以找零的最大张数:maxCount = payment / coin。
2. 将 change 数组中对应面值 coin 的数量设为 maxCount。
3. 更新 payment 的值为 payment - maxCount * coin。
4. 如果 payment 的值已经为 0,说明已经找零完毕,退出循环。
3. 统计 change 数组中所有面值的数量之和,即为找零钱的最少张数。
下面是具体的 Java 代码实现:
```
public static int[] getChange(int payment) {
int[] coins = {50, 20, 10, 5, 2, 1};
int[] change = new int[coins.length];
for (int i = 0; i < coins.length && payment > 0; i++) {
int maxCount = payment / coins[i];
change[i] = maxCount;
payment -= maxCount * coins[i];
}
return change;
}
public static int getMinChangeCount(int payment) {
int[] change = getChange(payment);
int count = 0;
for (int i = 0; i < change.length; i++) {
count += change[i];
}
return count;
}
```
可以通过调用 `getChange` 方法来获取找零钱的组合,通过调用 `getMinChangeCount` 方法来获取最少的找零钱张数。例如:
```
int payment = 87;
int[] change = getChange(payment);
int count = getMinChangeCount(payment);
System.out.println("Payment: " + payment);
System.out.println("Change: " + Arrays.toString(change));
System.out.println("Min change count: " + count);
```
输出结果为:
```
Payment: 87
Change: [1, 1, 1, 0, 1, 0]
Min change count: 4
```
其中,change 数组表示找零钱的组合为 50 元1张、20 元1张、10 元1张、5 元0张、2 元1张、1 元0张;最少的找零钱张数为 4 张。
用Java写假设商店货品价格皆不大于100元(且为整数),若顾客付款再100元内,求找给顾客最少货币个(张)数?(货币面值50元10元,5元,1元四种)
### 回答1:
您好,我可以回答您的问题。以下是用Java编写的解决方案:
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int price = scanner.nextInt();
int change = 100 - price;
int[] coins = {50, 10, 5, 1};
int count = 0;
for (int i = 0; i < coins.length; i++) {
count += change / coins[i];
change %= coins[i];
}
System.out.println(count);
}
}
```
以上代码可以计算出找给顾客最少货币个数。如果顾客付款不超过100元,程序会计算出需要找给顾客的最少货币个数。程序中使用了一个数组来存储货币面值,然后通过循环计算出需要找给顾客的每种货币的个数,最后将所有货币个数相加即可得到最终结果。
希望这个解决方案能够帮到您。
### 回答2:
首先,我们可以先将顾客付款与商品总价之差作为剩余金额。
接下来,我们要找出最少货币个数,可以采用贪心算法来解决。
首先,我们判断剩余金额是否大于等于50元,如果是,则找给顾客1张50元面值的货币,并将剩余金额减去50元;
然后,判断剩余金额是否大于等于10元,如果是,则找给顾客1张10元面值的货币,并将剩余金额减去10元;
然后,判断剩余金额是否大于等于5元,如果是,则找给顾客1张5元面值的货币,并将剩余金额减去5元;
最后,判断剩余金额是否大于等于1元,如果是,则找给顾客剩余金额个数的1元面值的货币。
通过以上步骤,即可找出最少货币个数。
### 回答3:
解决这个问题可以使用贪心算法。
具体的步骤如下:
1. 判断顾客付款金额与货品价格之差 diff = 100 - 货品价格,这个 diff 表示顾客需要找给顾客的金额。
2. 初始化4种货币面值的张数分别为50元张数、10元张数、5元张数、1元张数均为0。
3. 如果 diff 大于等于50,则从50元硬币开始找零,即 diff = diff - 50,同时50元张数加1。重复这一步骤,直到 diff 小于50。
4. 如果 diff 大于等于10,则从10元硬币开始找零,即 diff = diff - 10,同时10元张数加1。重复这一步骤,直到 diff 小于10。
5. 如果 diff 大于等于5,则从5元硬币开始找零,即 diff = diff - 5,同时5元张数加1。重复这一步骤,直到 diff 小于5。
6. 如果 diff 大于等于1,则从1元硬币开始找零,即 diff = diff - 1,同时1元张数加1。重复这一步骤,直到 diff 小于1。
7. 最终结果为50元张数、10元张数、5元张数、1元张数的总和即为最少的货币张数。
通过这种方法,就可以求得找给顾客最少货币张数的解。注意,这个算法的前提是顾客付款金额不大于100元且为整数,且货品价格也不大于100元且为整数。如果超过了这个限制条件,可能会得到错误的结果。
阅读全文