1. 程式人生 > >用python實現零錢找零的三種方法

用python實現零錢找零的三種方法

1.遞迴(recursion)

def coins_changeREC(coin_values, change):
    """
    遞迴實現零錢找零
    """
    min_count = change 
    # base case
    if change in coin_values:
        return 1
    for value in [i for i in coin_values if i <= change]:
        count = 1 + coins_changeREC(coin_values, change-value)
        if
count < min_count: min_count = count return min_count

2.新增caching的遞迴

def coins_changeREC_cache(coin_values, change, known_counts=None):
    """
    添加了caching的遞迴零錢找零,
    用空間換時間
    """
    if known_counts == None:
        known_counts = [0] * (change + 1) # why plus 1? think!
min_count = change # base case if change in coin_values: return 1 elif known_counts[change] > 0: return known_counts[change] for value in [i for i in coin_values if i <= change]: count = 1 + coins_changeREC_cache(coin_values, change-value, known_counts) if
count < min_count: min_count = count known_counts[change] = min_count return min_count

3.動態規劃(Dynamic Programming)

def coins_changeDP(coin_values, change, min_counts=None, last_used_coins=None):
    """
    利用動態規劃(Dynamic Programming)的思想實現零錢找零
    """
    if min_counts == None:
        min_counts = [0] * (change + 1)
    if last_used_coins == None:
        last_used_coins = [0] * (change + 1)

    for cents in range(change + 1):
        min_count = cents
        for value in [i for i in coin_values if i <= cents]:
            if 1 + min_counts[cents-value] < min_count:
                min_count = 1 + min_counts[cents-value]
                last_used_coins[cents] = value
        min_counts[cents] = min_count

    return min_counts[-1], print_coins(change, last_used_coins)

def print_coins(change, last_used_coins):
    used_coins = []
    while change > 0:
        used_coins.append(str(last_used_coins[change]))
        change = change - last_used_coins[change]
    return ','.join(used_coins)

最後測試三種方法實現的零錢找零的時間效率:

def main():
    import timeit
    value_list = [1, 5, 10, 25]
    t1 = timeit.Timer('coins_changeREC(%s,%s)'%(value_list, 63),'from __main__ import coins_changeREC, main')
    t2 = timeit.Timer('coins_changeREC_cache(%s,%s)'%(value_list, 63),'from __main__ import coins_changeREC_cache, main')
    t3 = timeit.Timer('coins_changeDP(%s,%s)'%(value_list, 63),'from __main__ import coins_changeDP, main')
    print(t1.timeit(number=1))
    print(t2.timeit(number=1))
    print(t3.timeit(number=1))

main()

結果顯示:
這裡寫圖片描述
第一種沒有新增caching的遞迴實現,完成一次63分零錢的找零竟然需要60s,簡直無法忍受。
而添加了caching的遞迴,一次找零0.22ms就完成了,這是生動的用空間換時間的演算法。而採用DP思想的演算法,0.14ms就完成了。

相關推薦

python實現零錢方法

1.遞迴(recursion) def coins_changeREC(coin_values, change): """ 遞迴實現零錢找零 """ min_cou

Python實現下載檔案的方法

下面來看看三種方法是如何來下載zip檔案的:方法一: import urllib print "downloading with urllib" url = 'http://www.jb51.net//test/demo.zip' urllib.urlretrieve(url, "demo.zip")

Python實現矩陣相乘的方法

問題描述 分別實現矩陣相乘的3種演算法,比較三種演算法在矩陣大小分別為 22∗22 2^2*2^2, 23∗23 2^3*2^3, 24∗24 2^4*2^4, 25∗25 2^5*2^5,

python打開瀏覽器的方法

PE browser www. baidu app div 解決方案 com open 1.startfile方法 import os os.startfile("C:\Program Files (x86)\Google\Chrome\Application\chrom

Python刪除列表元素的方法

列表有三種方法來刪除列表值: list.pop(index) 預設是最後一個元素 s = ['aa', 'bb', 'cc'] s.pop() list.remove(value) 刪除第一個找的值 s.remove(s[-1]) print s del  刪除

ROS驅動USB攝像頭的方法

參考: ROS機器人程式設計(原書第2版)-恩裡克.費爾南德斯:第5章 計算機視覺   方法1: 使用usb_cam這個ROS包直接驅動 方法2: 使用gscam這個ROS包直接驅動 方法3: 自制OpenCV,cv_bridge,image_transport驅動ROS包

MATLAB解決非線性方程的方法

對非線性方程的分析有很多的方法,我們這裡提供三種程式設計方法,在MATLAB上進行模擬。 1,二分法 二分法的公式可以表示為 然後呼叫這個函式就可以得到最終的結果 下面我們給出另外兩個方法的函式程式碼 2,牛頓迭代法 牛頓迭代法的公式可以表示為 3,割線法 程式的下載連結為 h

0012-OpenCV批量讀取圖片的方法

有時我們需要批量讀取圖片,所以我們有必要知道怎麼在OpenCV開源環境下批量讀取圖片! 批量讀取圖片的關鍵是如何讓程式知道資料夾下圖片的名字! 第一種方法: 這種方法只針對圖片名字有規律的情況,比如: ***(0).jpg ***(1).jpg ***(2).jpg ***(3).jpg .

Python :單元測試的方法,函式測試,類測試,文件測試

對程式的功能修改時,判斷是否影響了原有的功能使用的方法 #函式的單元測試 #類的測試方法與函式測試一致 def MySum(x,y) : return x+y def MySub(x,y) : return x-y #假設對以上的模組進行了修改,需要判斷是否對原有的

python讀取文字檔案的方法

參考連結 python讀取文字檔案的內容,有三種方法。 read()、readline()、readlines() read() read()是最簡單的一種方法,一次性讀取檔案的所有內容放在一個大字串中,即記憶體中。 file=open('test.txt') try:

Python實現"旋轉陣列"的一方法

給定一個數組,向右旋轉陣列k步,k非負 Example 1: Input: [1,2,3,4,5,6,7] and k = 3 Output: [5,6,7,1,2,3,4] Explanation: rotate 1 steps to the right: [7,1,

Java實現ping功能的方法

檢測裝置的執行狀態,有的是使用ping的方式來檢測的。所以需要使用java來實現ping功能。 為了使用java來實現ping的功能,有人推薦使用java的 Runtime.exec()方法來直接呼叫系統的Ping命令,也有人完成了純Java實現Ping的程式,使用的是Jav

Python爬蟲解析網頁的方法,lxml、BeautifulSoup、re案例!

常用的類庫為lxml,BeautifulSoup,re(正則)  學習Python中有不明白推薦加入交流群                 號:960410445     &nb

Python 實現字串反轉的9方法

在做leetcode的試題中,做到反轉整數,就涉及到字串反轉,為了儘可能可以寫出更多的方法,於是寫下這篇文章 樣例:如 a='123456789' 反轉成 a='987654321' 第一種方法:使用字串切片 >>> a='123456789' >>> a = a[:

Nginx實現404頁面的方法

一個網站專案,肯定是避免不了404頁面的,通常使用Nginx作為Web伺服器時,有以下集中配置方式: 第一種:Nginx自己的錯誤頁面 Nginx訪問一個靜態的html 頁面,當這個頁面沒有的時候,

Python實現"各位相"的兩方法

給定一個非負整數num,重複累加num中的每一個數字直至結果為個位數 Input: 38 Output: 2 Explanation: The process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one di

Python實現"醜數"的一方法

寫一個程式判斷給定的整數是否為醜數 醜數就是隻包含質因數 2, 3, 5 的正整數 Example 1: Input: 6 Output: true Explanation: 6 = 2 × 3 Example 2: Input: 8 Output: true E

Python實現"缺失數字"的四方法

給定一個包含 0, 1, 2, ..., n 中 n 個數的序列,找出 0 .. n 中沒有出現在序列中的那個數 Example 1: Input: [3,0,1] Output: 2 Example 2: Input: [9,6,4,2,3,5,7,0,1] O

java實現動態代理的方法

緒論:以下三種java實現動態代理的的方式,分別為基於jdk的,基於cglib的和基於javassist的,其中需要注意的兩點 一:基於jdk實現的動態代理需要實現父類,而其他兩種不需要 二:其中基於cglib的需要額外的jar包依賴,pom的依賴如下 <!-- https://m

C#中調SAPI實現語音識別的2方法

nac == pan fault 組件技術 關閉 int virt generic 通過微軟的SAPI,不僅僅可以實現語音合成TTS,同樣可以實現語音識別SR。下面我們就介紹並貼出相關代碼。主要有兩種方式: 1、使用COM組件技術,不管是C++,C#,Delphi都能