商店有面额为100元、50元、20元、10元、5元、2元、1元的纸币若干。输入每种面额纸币的数量,想要给顾客找零 k 元,最少要用多少张纸币?如果不能找零,输出-1。
时间: 2023-12-28 09:54:29 浏览: 263
以下是我给出的 Python 代码实现:
```python
def min_num_of_bills(bills, k):
# 面额数组
values = [100, 50, 20, 10, 5, 2, 1]
num_of_bills = 0
for i in range(len(values)):
# 计算当前面额需要的最小张数
num = min(bills[i], k // values[i])
# 减去已经计算的面额总额
k -= num * values[i]
# 计算使用的纸币数
num_of_bills += num
# 如果已经找完零,跳出循环
if k == 0:
break
# 如果还有剩余,说明无法找零
if k > 0:
return -1
else:
return num_of_bills
```
这个函数接收两个参数:一个整数列表 bills,表示各种面额纸币的数量,以及一个整数 k,表示需要找零的总金额。函数使用贪心算法,从大面额纸币开始计算,尽可能使用数量更少的纸币,直到找完为止。如果最终还有剩余,则说明无法找零,返回 -1。否则返回使用的纸币数。
相关问题
题目描述 哈哈哈~~~学委喜欢的女生失恋了~~ 那么这时学委带着自己喜欢的女生去逛街啦!! 他带了若干张1元,2元,5元,10元,20元,50元,100元的纸币,结帐的时候学委要支付n 元,毕竟和喜欢的女生在一起,掏出太多张钱结账是很丢脸的!!那么问题就来了,已知学委有的这些面额的张数,那么学委最少需要多少张纸币才能支付n元?如果不能支付n元,那么输出“xuewei,ni zhe chou diaosi”; 输入 输入文件第一行是T,表示T 组数据(1<=T<=10001); 每组数据有两行,第一行是n(1<=n<=1e4),代表学委要付的款; 第二行有7个整数a1,a2...a7(0<=a1<=100),分别代表1元,2元,5元...100元的张数; 输出 如果能支付n元,输出最少需要的张数,否则输出“xuewei,ni zhe chou diaosi”;
这是一道典型的贪心算法题目。针对每个面额,我们都尽可能地使用多个这个面额的纸币,直到无法再使用为止。
下面是Python的代码实现:
```python
T = int(input())
for _ in range(T):
n = int(input())
nums = list(map(int, input().split()))
# 面额数组
values = [1, 2, 5, 10, 20, 50, 100]
# 记录每个面额使用的张数
used = [0] * len(values)
# 从大到小遍历面额
for i in range(len(values) - 1, -1, -1):
# 使用当前面额的纸币数量
count = min(nums[i], n // values[i])
used[i] = count
n -= count * values[i]
# 如果n不为0,无法支付,输出提示
if n != 0:
print("xuewei,ni zhe chou diaosi")
else:
# 计算总共使用的纸币数量
ans = sum(used)
print(ans)
```
这里使用了一个`used`数组来记录每个面额使用的张数,这个数组的长度为7,对应了题目中给出的7种面额。在遍历每个面额时,使用`min(nums[i], n // values[i])`计算出当前面额纸币的最大使用数量,然后更新`used`数组和`n`的值。最后如果`n`不为0,即无法支付,输出提示;否则,计算`used`数组的和,即为最少需要的张数。
小明手中有硬币,小红手中有若干张10元的纸币。已知 1 角硬币厚 1.8mm,5 角硬币厚 1.5mm,1 元硬币厚 2.0mm 。小红拿出若干张10元的纸币,小明要将 1 角的硬币放成一摞,将 5 角的硬币放成一摞,将 1 元的硬币放成一摞,如果 3 摞硬币一样高,且三摞硬币的金额之和正好等于小红要求的面值,则双方交换,否则没有办法交换。 输入: 小红希望交换几张10元的纸币 输出: 1 角的数量,5 角的数量,1元的数量
这是一个比较复杂的问题,需要进行一些数学计算。我们先来分析一下问题。
首先,我们需要确定三种硬币的高度。假设 1 角硬币、5 角硬币、1 元硬币的数量分别为 a、b、c,那么它们的总高度就是:1.8a + 1.5b + 2.0c。
然后,我们需要根据小红要求的面值,推算出她拿出的纸币数量。假设小红拿出了 n 张 10 元纸币,那么她要求的金额就是 10n 元。我们可以列出一个方程:
10n = 0.01a + 0.05b + 1.00c
接下来,我们需要找到一组合适的 a、b、c 的值,使得它们满足上述两个条件。这里可以采用枚举的方法,对 a、b、c 进行穷举,找到符合条件的组合。
具体实现时,我们可以在循环中依次枚举 a、b、c 的取值,在每次循环中计算硬币的总高度和金额,并判断是否符合条件。如果符合条件,就输出 a、b、c 的值,结束程序。如果循环结束后仍然没有找到符合条件的组合,就输出无解。
代码如下:
阅读全文