貪心演算法也被稱為貪婪演算法,它是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。
貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。
1. 貪心演算法基礎
貪心演算法的解題方式是從可選的第乙個解開始逐步到達目標解,如果在尋解的過程
中因某種條件限制而停止向前,就得到乙個近似解,因此貪心演算法存在以下幾個問題:
1) 貪心演算法得到的解不一定是最優解
2) 不適用於最值問題
3) 適用於部分約束條件的問題求解
貪心演算法的過程如下:
1.建立數學模型來描述問題
2.把求解的問題分成若干個子問題
3.對每一子問題求解,得到子問題的區域性最優解
4.把子問題的解區域性最優解合成原來解問題的乙個解
演算法求解過程是首先從某一解向目標值出發,得到可行解的元素,然後合成所有解元素而得到乙個可行解。
2. 找零問題
1) 問題描述:
假設只有1 分、2 分、五分、1角、二角、五角、1元的硬幣。在超市結賬時,如果需要找零錢,收銀員希望將最少的硬幣數找給顧客。那麼,給定需要找的零錢數目,如何求得最少的硬幣數呢?
2) 問題分析
在找零的時候會有多種方案,當零錢為五角的時候,可以用乙個五角的,也可以用
兩個兩角的和乙個一角的,還可以用五個一角的,還可以用乙個兩角的和三個一角的,因此在我們在求解這個問題的時候可以從這些角度來思考。
3) **實現def main():
d = [0.01,0.02,0.05,0.1,0.2,0.5,1.0] # 儲存每種硬幣面值
d_num = # 儲存每種硬幣的數量
s = 0
# 擁有的零錢總和
temp = input('請輸入每種零錢的數量:')
d_num0 = temp.split(" ")
for i in range(0, len(d_num0)):
s += d[i] * d_num[i] # 計算出收銀員擁有多少錢
sum = float(input("請輸入需要找的零錢:"))
if sum > s:
# 當輸入的總金額比收銀員的總金額多時,無法進行找零
print("資料有錯")
return 0
s = s - sum
# 要想用的錢幣數量最少,那麼需要利用所有面值大的錢幣,因此從陣列的面值大的元素開始遍歷
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] # 貪心的關鍵步驟,使sum動態的改變
print("用了%d個%f元硬幣"%(n, d[i]))
i -= 1
if __name__ == "__main__":
main()
輸出結果為:請輸入每種零錢的數量:14 12 13 13 23 13 6
請輸入需要找的零錢:1.3
用了1個1.000000元硬幣
用了1個0.200000元硬幣
用了1個0.100000元硬幣
首先輸入了所有零錢的數量,然後計算出錢的總數,保證零錢能夠找零,然後進入下一步找零。為了保證找零的數量最小,使用大面值的硬幣,因此從大面值的硬幣開始遍歷,如果大面值無法滿足的時候再往下取,這個演算法的關鍵就在於sum的值是動態改變的,根據改變後的sum值再去進行判斷,直到最後完成。
3. 汽車加油問題
一輛汽車加滿油後可行駛n公里。旅途中有若干個加油站。設計乙個有效演算法,指出應在哪些加油站停靠加油,使沿途加油次數最少。 對於給定的n(n <= 5000)和k(k <= 1000)個加油站位置,程式設計計算最少加油次數。
**如下:def petrol():
n = 100
k = 5
d = [23,45,39,70,54,62]
# 表示加油站之間的距離
num = 0
# 表示加油次數
for i in range(k):
if d[i] > n:
print('沒有適合的')
# 如果距離中得到任何乙個數值大於n 則無法計算
return
i, s = 0, 0
# 利用s進行迭代
while i <= k:
s += d[i]
if s >= n:
# 當區域性和大於n時則區域性和更新為當前距離
s = d[i]
# 貪心意在令每一次加滿油之後跑盡可能多的距離
num += 1
i += 1
print(num)
if __name__ == '__main__':
petrol()
輸出結果為4
這道題我們首先要判斷當油量是滿的時候是否可以大於所有相鄰加油站之間的距離,然後開始迭代,使用while語句,如果i等於5的時候就退出迴圈,迴圈中當區域性和大於n時就把區域性和更新為當前距離,然後次數加一,直到退出迴圈。
演算法 貪心法
動態規劃在某一步決定優化函式的最大或者最小值時候,需要考慮子問題的優化函式值,從中選出最優的結果。貪心法 也是多不判斷,不考慮子問題的計算結果,根據當時情況採取 只顧眼前的 貪心策略決定取捨,工作量少於動態規劃很多,更具效率 可導致區域性最優化而不是全域性優化 n項活動,使用同乙個禮堂問題 si 和...
演算法 貪心法
感謝華北電力大學王墨玉老師的ppt 基礎知識 應用條件 最優子結構性質 原問題包含了其子問題的最優解 對於乙個問題可能會有不同的量度標準,選擇其中可以獲得最優解的量度標準是貪心法設計的核心問題 例題活動安排問題 可求得最優解 int greedyselector int s,int f,int a ...
演算法學習 貪心法
只選擇乙個子問題 1.快2.不能保證獲得最優解,可以作為近似解,一般,在特殊情況下可保證最優解。3.適合於組合優化問題 貪心選擇策略 分解方案 s s0,c c0 部分解s,候選集c while complete s 解擴充套件 c c c中引數重新計算以及候選集調整 注意 實現時dist 的初始值...