python实现找零钱_找零钱的最优步骤 探究(python)
問題描述
你是一家超市的收銀員,如果客人買了37元的東西,并且給了你100元,請問如何才能找到 給客人數量最少零錢,
如現有1,2,5,10,21,25 這些種類的零錢,最優的是,21,21,21 數量為3 .
思路解析
遞歸操作:每一次尋找可以用一張紙幣去找零,如果不能夠找零,則 找到所有<=該值的紙幣,減去該紙幣的值,再進行遞歸。
import time
#遞歸
def rec(coinValueList,change):
minCoins=change
if change in coinValueList:
return 1
else:
for i in [c for c in coinValueList if c <=change]:
numCoins =1 + rec(coinValueList,change-i)
if numCoins
minCoins=numCoins
return minCoins
t0=time.time()
x=rec([1,5,10,25,22],63)
print(x)
t1=time.time()
print("time:",t1-t0)
result:
image.png
從運行結果來看,這個遞歸耗時較長,因為做了過多的重復運算
2改進 使用 一個列表來存儲 每一個值的最小數量的狀態。
import time
def rec_ch(coinValueList,change,knownResult):
minCoins=change
if change in coinValueList:
knownResult[change]=1 #存儲狀態
return 1
elif knownResult[change]>0:
return knownResult[change]
else:
for i in [c for c in coinValueList if c <=change]:
numCoins =1 + rec_ch(coinValueList,change-i,knownResult)
if numCoins
minCoins=numCoins
knownResult[change]=minCoins
return minCoins
t0=time.time()
list1=[0]*64
y=rec_ch([1,5,10,25,22],63,list1)
print(y)
print(list1)
t1=time.time()
print("time:",t1-t0)
result:
image.png
3 動態規劃 ,我們把2步驟的方法整理一下。
def dp(coinValueList,change,minCoins,coinUsed):
for cents in range(change+1):
coinCount=cents
newCoin = 1
for j in [c for c in coinValueList if c <=cents]:
if minCoins[cents-j]+1
coinCount=minCoins[cents-j]+1
newCoin=j
minCoins[cents]=coinCount
coinUsed[cents]=newCoin
return minCoins[change]
def printCoins(coinUsed,change):
coin=change
while coin>0:
thisCoin=coinUsed[coin]
print(thisCoin)
coin=coin- thisCoin
t0=time.time()
list1=[0]*64
coinUsed=[0]*64
y=dp([1,5,10,25,22],63,list1,coinUsed)
print(y)
#print(list1)
t1=time.time()
print("time:",t1-t0)
printCoins(coinUsed,63)
result:
image.png
參考:Python數據結構與算法分析 (布拉德利 ? 米勒 戴維 ? 拉努姆)
總結
以上是生活随笔為你收集整理的python实现找零钱_找零钱的最优步骤 探究(python)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不孕不育的人会排卵吗
- 下一篇: python中的repr是什么意思_Py