Python貪心算法實(shí)例小結(jié)
本文實(shí)例講述了Python貪心算法。分享給大家供大家參考,具體如下:
1. 找零錢(qián)問(wèn)題:假設(shè)只有 1 分、 2 分、五分、 1 角、二角、 五角、 1元的硬幣。在超市結(jié)賬 時(shí),如果 需要找零錢(qián), 收銀員希望將最少的硬幣數(shù)找給顧客。那么,給定 需要找的零錢(qián)數(shù)目,如何求得最少的硬幣數(shù)呢?
# -*- coding:utf-8 -*-
def main():
d = [0.01,0.02,0.05,0.1,0.2,0.5,1.0] # 存儲(chǔ)每種硬幣面值
d_num = [] # 存儲(chǔ)每種硬幣的數(shù)量
s = 0
# 擁有的零錢(qián)總和
temp = raw_input('請(qǐng)輸入每種零錢(qián)的數(shù)量:')
d_num0 = temp.split(" ")
for i in range(0, len(d_num0)):
d_num.append(int(d_num0[i]))
s += d[i] * d_num[i] # 計(jì)算出收銀員擁有多少錢(qián)
sum = float(raw_input("請(qǐng)輸入需要找的零錢(qián):"))
if sum > s:
# 當(dāng)輸入的總金額比收銀員的總金額多時(shí),無(wú)法進(jìn)行找零
print("數(shù)據(jù)有錯(cuò)")
return 0
s = s - sum
# 要想用的錢(qián)幣數(shù)量最少,那么需要利用所有面值大的錢(qián)幣,因此從數(shù)組的面值大的元素開(kāi)始遍歷
i = 6
while i >= 0:
if sum >= d[i]:
n = int(sum / d[i])
if n >= d_num[i]:
n = d_num[i] # 更新n
sum -= n * d[i] # 貪心的關(guān)鍵步驟,令sum動(dòng)態(tài)的改變,
print("用了%d個(gè)%f元硬幣"%(n, d[i]))
i -= 1
if __name__ == "__main__":
main()
2. 求最大子數(shù)組之和問(wèn)題:給定一個(gè)整數(shù)數(shù)組(數(shù)組元素有負(fù)有正),求其連續(xù)子數(shù)組之和的最大值。
# -*- coding:utf-8 -*-
def main():
s = [12,-4,32,-36,12,6,-6]
print("定義的數(shù)組為:",s)
s_max, s_sum = 0, 0
for i in range(len(s)):
s_sum += s[i]
if s_sum >= s_max:
s_max = s_sum # 不斷更新迭代s_max的值,盡可能的令其最大
elif s_sum < 0:
s_sum = 0
print("最大子數(shù)組和為:",s_max)
if __name__ == "__main__":
main()
3. 一輛汽車(chē)加滿(mǎn)油后可行駛n公里。旅途中有若干個(gè)加油站。設(shè)計(jì)一個(gè)有效算法,指出應(yīng)在哪些加油站??考佑停寡赝炯佑痛螖?shù)最少。 對(duì)于給定的n(n <= 5000)和k(k <= 1000)個(gè)加油站位置,編程計(jì)算最少加油次數(shù)。
# 設(shè)汽車(chē)加滿(mǎn)油后可行駛n公里,且旅途中有k個(gè)加油站
def greedy():
n = 100
k = 5
d = [50,80,39,60,40,32]
# 表示加油站之間的距離
num = 0
# 表示加油次數(shù)
for i in range(k):
if d[i] > n:
print('no solution')
# 如果距離中得到任何一個(gè)數(shù)值大于n 則無(wú)法計(jì)算
return
i, s = 0, 0
# 利用s進(jìn)行迭代
while i <= k:
s += d[i]
if s >= n:
# 當(dāng)局部和大于n時(shí)則局部和更新為當(dāng)前距離
s = d[i]
# 貪心意在令每一次加滿(mǎn)油之后跑盡可能多的距離
num += 1
i += 1
print(num)
if __name__ == '__main__':
greedy()
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
基于Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何利用python實(shí)現(xiàn)簡(jiǎn)單的學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-12-12
詳解Python排序算法的實(shí)現(xiàn)(冒泡,選擇,插入,快速)
這篇文章主要為大家介紹了Python中常見(jiàn)的四種排序算法的實(shí)現(xiàn):冒泡排序、選擇排序、插入排序和快速排序,文中通過(guò)圖片詳細(xì)講解了它們實(shí)現(xiàn)的原理與代碼,需要的可以參考一下2022-04-04
一文教你用python編寫(xiě)Dijkstra算法進(jìn)行機(jī)器人路徑規(guī)劃
迪杰斯特拉(Dijkstra)算法是典型最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他節(jié)點(diǎn)的最短路徑,這篇文章主要給大家介紹了關(guān)于利用python編寫(xiě)Dijkstra算法進(jìn)行機(jī)器人路徑規(guī)劃的相關(guān)資料,需要的朋友可以參考下2021-08-08
Python內(nèi)置函數(shù)delattr的具體用法
本篇文章主要介紹了Python內(nèi)置函數(shù)delattr的具體用法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
python中print函數(shù)的用法示例與詳細(xì)講解
這篇文章主要給大家介紹了關(guān)于python中print函數(shù)的用法示例與詳細(xì)講解,print()函數(shù)可以將輸出的信息打印出來(lái),即發(fā)送給標(biāo)準(zhǔn)輸出流,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
python高階爬蟲(chóng)實(shí)戰(zhàn)分析
這篇文章給大家分享了python高階爬蟲(chóng)實(shí)戰(zhàn)的相關(guān)實(shí)例內(nèi)容以及技巧分析,有興趣的朋友參考下。2018-07-07
Python實(shí)現(xiàn)打磚塊小游戲代碼實(shí)例
這篇文章主要介紹了Python打磚塊小游戲,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
利用pyproj將經(jīng)緯度投影為平面坐標(biāo)以及地理坐標(biāo)系背景知識(shí)解讀
這篇文章主要介紹了利用pyproj將經(jīng)緯度投影為平面坐標(biāo)以及地理坐標(biāo)系背景知識(shí)解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06

