题目描述
【问题描述】
将n元(n是100的倍数)换成用10元、5元、2元的组合(其中每一面值都可取0),一共有多少种组合?输入n,输出组合数。
【输入形式】
输入钱币总额n
【输出形式】
输出组合数
【样例输入】
100
【样例输出】
66
知识点
- for循环
- if语句
- 判一个整数是否是偶数
有问题的解法
shumu=int(input())
count = 0
for n10 in range(shumu // 10 + 1):
for n5 in range(shumu // 5 + 1):
for n2 in range(shumu // 2 + 1):
if n10 * 10 + n5 * 5 + n2 * 2 == shumu:
count += 1
print(count)
上述解法存在的问题是,如果输入的钱数n很大的话,程序运行时间过长。原因是上述程序的效率过低。以钱数是10000为例,循环的次数是1000 * 2000 * 5000。
下面的代码将在两个方面做出改进,提升效率。
正确的解法
shumu=int(input())
count = 0
for n10 in range(shumu // 10 + 1):
for n5 in range((shumu - n10 * 10) // 5 + 1):
if (shumu - n10 * 10 - n5 * 5) % 2 == 0:
count += 1
print(count)
这个程序与上一个有问题的程序相比,有两点优化:
1. 减少了一重循环。为什么能减少呢?你想呀,当10块钱的张数和5块钱的张数定下来后,余下来的钱数是固定的,记作remain。要么,remain是偶数,能用2块钱凑齐;要么remain是奇数,不能用2块钱凑齐。能用2块钱凑齐,我们就增加1种换币组合。这里,压根儿不用去穷举2块钱的张数。这样,以钱数10000为例,循环的次数不大于1000 * 2000。
2. 减少了穷举5块钱张数的范围。做法是,shumu - n10 * 10,也就是减去10块钱凑起来的钱数。
小结
- 程序使用了双重循环,值得仔细辨析,直至熟练。
- 循环次数是影响程序效率的重要因素。