貪心演算法
貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。
貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當www.cppcns.com前狀態有關。
基本思路
思想貪心演算法的基本思路是從問題的某乙個初始解出發一步一步地進行,根據某個優化測度,每一步gkmcokhpt都要確保能獲得區域性最優解。每一步只考慮乙個資料,他的選取應該滿足區域性優化的條件。若下乙個資料和部分最優解連在一起不再是可行解時,就不把該資料新增到部分解中,直到把所有資料列舉完,或者不能再新增演算法停止 。
步驟p即為貪心策略,用來選擇符合條件的元素。
例子——硬幣找零
假設某國硬幣面值有1,5,10,25,100元五種面額,若店員為顧客找零時,需要給顧客找零a=36元,求硬幣數最少的情況。
這裡我程式設計客棧們的貪心策略為:
先找到最接近a的值,然後對a進行更新,然後進行迴圈。
**實現
def shortnum(a):
coins = [1,5,10,25,100]
out =
coins = coins[::-1]
for i in coins:
num = a//i
out=out+[i,]*num
a = a-num*i
if a<=0:
break
return out
a = 36
print(shortnum(a))
例子——任務規劃
問題描述:
輸入為任務集合x= [r1,r2,r3,...,rn],每個任務ri,都對應著乙個起始時間ai與結束時間bi
要求輸出為最多的相容的任務集。
如上圖,r1與r2相容,r3與r1和r2都不相容。
那麼這裡的貪心策略我們可以設為:
**實現
# 任務規劃
from collections import ordereddict
task = ordereddict()
task['r1'] = [0,4]
task['r2'] = [5,8]
task['r3'] = [10,13]
task['r4'] = [15,18]
task['r5'] = [7,11]
task['r6'] = [2,6]
task['r7'] = [2,6]
task['r8'] = [2,6]
task['r9'] = [12,16]
task['r10'] = [12,16]
task['r11'] = [12,16]
task['r12'] = [0,3]
listtask = list(task.items())
# 根據bi進行排序,結束時間早的在前面(氣泡排序)
for i程式設計客棧 in range(len(listtask)-1):
for j in range(len(listtask)-i-1):
if listtask[j][1][1] > list程式設計客棧task[j+1][1][1]:
listtask[j],listtask[j+1]=listtask[j+1],listtask[j]
print(listtask)
out =
out.append(listtask.pop(0))
def isvalid(temp,out):
for k in range(len(out)):
if temp[1][0]
python實現貪心演算法
在對問題求解時,總是作出在當前看來是最好的選擇。也就是說,不從整體上加以考慮,它所作出的僅僅是在某種意義上的區域性最優解 是否是全域性最優,需要證明 問題 有一天海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件都價值連城,一旦打碎就是去了價值,海盜船載重量為c,每件固定的重量為wi,海盜們該如何盡可能...
Python實現貪心演算法的示例
今天乙個研究生同學問我乙個問題,問題如下 超市有m個顧客要結賬,每個顧客結賬的時間為ti i取值從1到m 超市有n個結賬出口,請問全部顧客怎麼選擇出口,可以最早完成全部顧客的結賬,並用 實現。其實利用的就是貪心演算法來解決這個問題,那麼,什麼是貪心演算法?怎麼用貪心演算法解決這個問題?讓我一一道來。...
python貪心演算法極差問題 極差的貪心演算法實現
1 極差的貪心演算法實現,數列極差問題描述 給定,n,個正整數數列,進行如下操作 每次刪去兩個數,a,和,b,添,加乙個數,a b 1,直到只剩乙個數,n,在所,有這樣的,n,中,有乙個最大,max,和最小,min,m max min,是極差。設計程式計算,m,用貪心演算法演算法思想 對於給定的數列...