将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。
输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。
运用了两种方法,一种优化的枚举法,一种穷举法(也是枚举法)。
x=int(input())
count=0
total=0
for f5 in range((x-3)//5,0,-1):
for f2 in range((x-5*f5-1)//2,0,-1):
f1=x-5*f5-2*f2
if f1>=1:
count+=1
total=f5+f2+f1
print(f'fen5:{f5}, fen2:{f2}, fen1:{f1}, total:{total}')
print(f'count = {count}')
x=int(input())
count=0
total=0
for f5 in range(x//5,0,-1):
for f2 in range(x//2,0,-1):
for f1 in range(x,0,-1):
if 5*f5+2*f2+f1==x:
count+=1
total=f5+f2+f1
print(f'fen5:{f5}, fen2:{f2}, fen1:{f1}, total:{total}')
print(f'count = {count}')
| 循环层数 | 2层 | 3层 |
| 循环次数 | 少(精确范围) | 多(所有可能) |
| 计算f1的方式 | 公式计算 | 循环遍历 |
| 判断条件 | f1≥1 | 5f5+2f2+f1==x |
| 效率 | 高 | 低(尤其x大时) |
且输入数字13时,代码1用时12ms,代码2用时22ms。代码1效率显著更高。




