Python入门100道习题(4)——换散币

题目描述

【问题描述】
将n元(n是100的倍数)换成用10元、5元、2元的组合(其中每一面值都可取0),一共有多少种组合?输入n,输出组合数。

【输入形式】
输入钱币总额n

【输出形式】
输出组合数

【样例输入】
100

【样例输出】
66

知识点

  1. for循环
  2. if语句
  3. 判一个整数是否是偶数

有问题的解法

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块钱凑起来的钱数。

小结

  1. 程序使用了双重循环,值得仔细辨析,直至熟练。
  2. 循环次数是影响程序效率的重要因素。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值