找零錢問題(難度系數為3)
« 問題描述
設有n種不同面值的硬幣,各硬幣的面值存於數組T[1:n]中。現要用這些面值的硬幣來找錢,可以實用的各種面值的硬幣個數不限。當只用硬幣面值T[1],T[2],…,T[i]時,可找出錢數j的最少硬幣個數記為C(i,j)。若只用這些硬幣面值,找不出錢數j時,記C(i,j)=∞。
«編程任務
設計一個動態規划算法,對1≤j≤L,計算出所有的C( n,j )。算法中只允許實用一個長度為L的數組。用L和n作為變量來表示算法的計算時間復雜性
«數據輸入
從屏幕輸入數據。輸入第1行中有1個正整數n(n<=13),表示有n種硬幣可選。接下來的一行是每種硬幣的面值。由用戶輸入待找錢數j。
« 結果輸出
程序運行結束時,將計算出的所需最少硬幣個數輸出到屏幕。
輸入示例 |
輸出文件示例 |
3 1 2 5 9 |
3 |
def get_min_coins(coin_combinations,amount_rem): coin_list = [] sorted_coin_combinations = sorted(coin_combinations, reverse = True) #將面值從大到小排序 for coin_val in sorted_coin_combinations: coin_count = int(amount_rem/coin_val) #計算每個面值的個數(換成零錢時) coin_list += [coin_val]*coin_count #將零錢放入輸出列表 amount_rem -= coin_val * coin_count #找零之后,剩下的錢 if amount_rem <= 0: break if amount_rem != 0: print("無法找零!") else: return coin_list if __name__ == "__main__": n = (int)(input("請輸入面值個數:")) coin_combinations = [] for i in range(n): coin_combinations.append((int)(input("面值:"))) money = (int)(input("需要找的零錢:")) print(get_min_coins(coin_combinations,money))