用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都能