python 最小硬币数_Python之动态规划(最少硬币数找零)
完整代碼:
# 動態規劃最少硬幣數找零
def dpMakeChange(coinValueList, change, minCoins, coinsUsed):
for cents in range(change + 1):#依次循環從0到所需兌換面值的每一個面值
coinCount = cents #初始化最優解為當前面值數
newCoin = 1 #初始化找零硬幣面值列表中的面值
for j in [c for c in coinValueList if c <= cents]:#在不大于要找零的硬幣面值列表中循環
# 注:minCoins[cents - j] + 1 = cents - j的最優解 + 1(1是j的最優解,因為j為一個硬幣) = cents的最優解 - j的最優解 + j的最優解 = cents的最優解,所以下一行代碼的意思就是:若當前面值的最優解比上一循環(或初始)當前面值的最優解更小,則
if minCoins[cents - j] + 1 < coinCount:
coinCount = minCoins[cents - j] + 1 #臨時保存當前面值的最優解
# 將當前硬幣面值j臨時保存為當前找零面值在找零硬幣面值列表中的對應值
newCoin = j
minCoins[cents] = coinCount #記錄當前找零面值在找零最優解列表中的最優解
coinsUsed[cents] = newCoin#記錄當前找零面值在找零硬幣面值列表中對應的值
return minCoins[change]#返回待找零數值的最優解
# 獲取最終找零的硬幣面值
def printCoins(coinsUsed, change):
while change > 0:
thisCoin = coinsUsed[change]#從找零硬幣面值列表中獲取對應的硬幣面值
print(thisCoin, end = '、')
change = change - thisCoin #去除該面值后繼續循環獲取
def main():
amnt = 63 #待找零面值
clist = [1, 5, 10, 21, 25]#有效硬幣面值列表,有序無序都可以
coinsUsed = [0] * (amnt + 1)#初始化找零硬幣面值列表
coinCount = [0] * (amnt + 1)#初始化包含所有找零最優解的列表
zhao = dpMakeChange(clist, amnt, coinCount, coinsUsed)#獲取找零硬幣最少個數
resu = "找零" + str(amnt) + "美分需要" + str(zhao) + "個硬幣。"
print(resu)
print("它們是:")
printCoins(coinsUsed, amnt)#獲取最終找零的硬幣面值
print("\n使用列表如下:")
print(coinsUsed)#找零硬幣面值列表
print("所有數值最優解列表如下:")
print(coinCount)#包含從0到所需兌換面值的每一個面值對應的最優解
main()
結果為:
找零63美分需要3個硬幣。
它們是:
21、21、21、
使用列表如下:
[1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 10, 1, 1, 1, 1, 5, 1, 1, 1, 1, 10, 21, 1, 1, 1, 25, 1, 1, 1, 1, 5, 10, 1, 1, 1, 10, 1, 1, 1, 1, 5, 10, 21, 1, 1, 10, 21, 1, 1, 1, 25, 1, 10, 1, 1, 5, 10, 1, 1, 1, 10, 1, 10, 21]
所有數值最優解列表如下:
[0, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 2, 1, 2, 3, 4, 1, 2, 3, 4, 5, 2, 2, 3, 4, 5, 2, 3, 4, 5, 6, 3, 3, 2, 3, 4, 3, 2, 3, 4, 5, 2, 3, 3, 4, 5, 3, 3, 4, 5, 6, 3, 4, 4, 3]
總結
以上是生活随笔為你收集整理的python 最小硬币数_Python之动态规划(最少硬币数找零)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openstack租户管理_openst
- 下一篇: python宣传图片_宣传图片制作网站