1. 程式人生 > >Python入門100道習題(4)——換散幣

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. 迴圈次數是影響程式效率的重要因素。