貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,也就是說,不從整體最優上加以考慮,演算法得到的是在某種意義上的區域性最優解。
貪心演算法一般按如下步驟進行:
①建立數學模型來描述問題。
②把求解的問題分成若干個子問題。
③對每個子問題求解,得到子問題的區域性最優解。
④把子問題的解區域性最優解合成原來解問題的乙個解。
貪心演算法是一種對某些求最優解問題的更簡單、更迅速的設計技術。貪心演算法的特點是一步一步地進行,常以當前情況為基礎根據某個優化測度作最優選擇,而不考慮各種可能的整體情況,省去了為找最優解要窮盡所有可能而必須耗費的大量時間。貪心演算法採用自頂向下,以迭代的方法做出相繼的貪心選擇,每做一次貪心選擇,就將所求問題簡化為乙個規模更小的子問題,通過每一步貪心選擇,可得到問題的乙個最優解。雖然每一步上都要保證能獲得區域性最優解,但由此產生的全域性解有時不一定是最優的,所以貪心演算法不要回溯。
利用貪心法求解的問題應具備如下2個特徵。
1、貪心選擇性質
乙個問題的整體最優解可通過一系列區域性的最優解的選擇達到,並且每次的選擇可以依賴以前作出的選擇,但不依賴於後面要作出的選擇。這就是貪心選擇性質。對於乙個具體問題,要確定它是否具有貪心選擇性質,必須證明每一步所作的貪心選擇最終導致問題的整體最優解。
2、最優子結構性質
當乙個問題的最優解包含其子問題的最優解時,稱此問題具有最優子結構性質。問題的最優子結構性質是該問題可用貪心法求解的關鍵所在。在實際應用中,至於什麼問題具有什麼樣的貪心選擇性質是不確定的,需要具體問題具體分析。
「今年暑假不ac?」
「是的。」
「那你幹什麼呢?」
「看世界盃呀,笨蛋!」
「@#$%^&*%…」
確實如此,世界盃來了,球迷的節日也來了,估計很多acmer也會拋開電腦,奔向電視了。
作為球迷,一定想看盡量多的完整的比賽,當然,作為新時代的好青年,你一定還會看一些其它的節目,比如新聞聯播(永遠不要忘記關心國家大事)、非常6+7、超級女生,以及王小丫的《開心辭典》等等,假設你已經知道了所有你喜歡看的電視節目的轉播時間表,你會合理安排嗎?(目標是能看盡量多的完整節目)
輸入資料報含多個測試例項,每個測試例項的第一行只有乙個整數n(n<=100),表示你喜歡看的節目的總數,然後是n行資料,每行包括兩個資料ti_s,ti_e (1<=i<=n),分別表示第i個節目的開始和結束時間,為了簡化問題,每個時間都用乙個正整數表示。n=0表示輸入結束,不做處理。
對於每個測試例項,輸出能完整看到的電視節目的個數,每個測試例項的輸出佔一行。
121 3
3 40 7
3 815 19
15 20
10 15
8 18
6 12
5 10
4 14
2 90
#include
intmain()
t=a[i]
;//將最早的節目交換到最前面
a[i]
=a[k]
; a[k]
=t; t=b[i]
; b[i]
=b[k]
; b[k]
=t;}
j=0;
for(i=
1;i)//節目時間不衝突則num++
}printf
("%d\n"
,num)
;//輸出
}return0;
}
ACM寒假集訓
出自 南昌理工學院acm集訓隊 什麼是dfs?void dfs 狀態 a 1.判斷狀態是否合法。合法繼續執行,否則則回到上次呼叫 2.先下走一層,也就是呼叫dfs a void dfs 引數用來表示狀態 if 越界或者是不合法狀態 return if 特殊狀態 剪枝 return for 擴充套件方...
牛客寒假集訓6 美食
題目鏈結 貪心從i等於0開始遍歷,不管i等於0時的值是奇數還是偶數,除以2,把能吃的吃完,如果是奇數,會剩下一口,i等於1的值大於1,則這剩下的一口和i等於1裡的一口湊成兩口,則吃的總次數加一,i等於1的值減1,一直遍歷到最後乙個 注意如果是n個美食,要開乙個n 1的陣列並初始化為0,因為,如果只開...
ACM寒假集訓 7 dp(動態規劃)
將待求解問題分解成若干個子問題 經典三角問題 記憶陣列 intmaxsum int i,int j int main void cout maxsum 1 1 return0 由於遞迴會導致重複計算,使得時間複雜度變高,所以上面的記憶陣列用來儲存結果。一般的遞迴都可以用陣列,就是遞推寫出來 incl...