貪心的意思在於在作出選擇時,每次都要選擇對自身最為有利的結果,保證自身利益的最大化。貪心演算法就是利用這種貪心思想而得出一種演算法。
貪心演算法作為五大演算法之一,在資料結構中的應用十分廣泛。例如:在求最小生成樹的 prim 演算法中,挑選的頂點是候選邊中權值最小的邊的乙個端點。在 kruskal 演算法中,每次選取權值最小的邊加入集合。在構造霍夫曼樹的過程中也是每次選擇最小權值的節點構造二叉樹。這種每次在執行子問題的求解時,總是選擇當前最優的情形,恰好符合貪心的含義。
貪心演算法可以簡單描述為:大事化小,小事化了。對於乙個較大的問題,通過找到與子問題的重疊,把複雜的問題劃分為多個小問題。並且對於每個子問題的解進行選擇,找出最優值,進行處理,再找出最優值,再處理。也就是說貪心演算法是一種在每一步選擇中都採取在當前狀態下最好或最優的選擇,從而希望得到結果是最好或最優的演算法。
貪心演算法在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,所做出的僅是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。
(1)建立數學模型來描述問題。
(2)把求解的問題分成若干個子問題。
(3)對每一子問題求解,得到子問題的區域性最優解。
(4)把子問題的區域性最優解合成原來問題的乙個解。
從問題的某一初始解出發
while (能朝給定總目標前進一步)
do選擇當前最優解作為可行解的乙個解元素;
由所有解元素組合成問題的乙個可行解。
題目描述:
小明手中有 1,5,10,50,100 五種面額的紙幣,每種紙幣對應張數分別為 5,2,2,3,5 張。若小明需要支付 456 元,則需要多少張紙幣?
題目分析:
1)建立數學模型
設小明每次選擇紙幣面額為 xi ,需要的紙幣張數為 n 張,剩餘待支付金額為 v ,則有:
x1 + x2 + … + xn = 456.
(2)問題拆分為子問題
小明選擇紙幣進行支付的過程,可以劃分為n個子問題:即每個子問題對應為:
在未超過456的前提下,在剩餘的紙幣中選擇一張紙幣。
(3)制定貪心策略,求解子問題
制定的貪心策略為:在允許的條件下選擇面額最大的紙幣。則整個求解過程如下:
選取面值為 100 的紙幣,則 x1 = 100, v = 456 – 100 = 356;
繼續選取面值為 100 的紙幣,則 x2 = 100, v = 356 – 100 = 256;
繼續選取面值為 100 的紙幣,則 x3 = 100, v = 256 – 100 = 156;
繼續選取面值為 100 的紙幣,則 x4 = 100, v = 156 – 100 = 56;
選取面值為 50 的紙幣,則 x5 = 50, v = 56 – 50 = 6;
選取面值為 5 的紙幣,則 x6 = 5, v = 6 – 5 = 1;
選取面值為 1 的紙幣,則 x7 = 1, v = 1 – 1 = 0;求解結束
(4)將所有解元素合併為原問題的解
小明需要支付的紙幣張數為 7 張,其中面值 100 元的 4 張,50 元 1 張,5 元 1 張,1 元 1 張。
**實現:
const
int n =5;
int count[n]=;
//每一張紙幣的數量
int value[n]=;
intsolve
(int money)
if(money>
0) num=-1
;return num;
}
-----------作者程式設計師小吳,此文原連線 初步了解一下什麼是ruby
關鍵字 def undef 方法定義 module 模組定義 class 類otbinj定義 defined?檢查型別 條件語句 if,then,else,elsif,case,when,unless 迴圈語句 for i程式設計客棧n,while,until,next,break,do,redo,...
簡單介紹一下什麼是SpringCloud?
我覺著springcloud就是乙個分布式微服務架構的一站式解決方案,它提供了很多元件用來解決了分布式架構所帶來的一些問題。我在之前工作裡用過eureka 優瑞卡 ribbon 瑞本 feign 菲恩 hystrix 黑絲錘科絲 zuul 入歐 這麼幾個元件。其中 eureka在整個微服務架構中充當...
TDengine簡單了解一下
tdengine是taosdata的產品,taosdata是由陶姓海歸創立的,目測是用自己的姓氏命名的。tdengine號稱是專為物料網設計的平台,在我看來就是乙個時序資料庫而已,就像influxdb,它也和influxdb進行對比,讀寫速度,儲存空間各方面效能都強於influxdb。tdengin...