1.對貪心演算法的認識
貪心演算法在求解問題時,不從整體上考慮,而是得到某種意義上的區域性最優解,做出當前看來是最好的選擇。每次的選擇都會依賴之前作出的選擇,而對後面的選擇不會產生影響。
它具有最優子結構的性質,即問題的最優解包含其子問題的最優解。但貪心演算法不是對於所有的問題都能得到整體最優解,最重要的是貪心策略的選擇。
與動態規劃相比,貪心演算法的特點在於它是自頂向下進行分解,每一步的最優解包含上一步的最優解,但上一步之前的最優解不保留最終得到某種意義上是的區域性最優解,動態規劃則會記錄所有的區域性最優解。
2.貪心性質的證明
選擇的問題:區間選點
問題描述:
數軸上有n個閉區間[ai, bi]。取盡量少的點,使得每個區間內都至少有乙個點(不同區間內含的點可以是同乙個)。
第一行乙個數字n,表示有n個閉區間。 下面n行,每行包含2個數字,表示閉區間[ai, bi]
乙個整數,表示至少需要幾個點
在這裡給出一組輸入。例如:
3
1 32 4
5 6
輸出樣例:
2
**:
#include#include#define max 1000using namespace std;
struct areaareas[max];
bool cmp(struct area a, struct area b)
int main()
sort(areas,areas + n,cmp);
int count = 0;
int finish = 0;
for(int i = 0; i < n; i++)
} cout << count << endl;
}
貪心策略:將每個區間按照結尾由早至晚進行排序,每次選擇結尾最早且與前乙個區間不會重疊的區間。
證明:當其中一次選擇的是區間[s(i),t(i)]時,t(i)則為當前選擇中結尾最早的選擇。
若此問題的最優解為k,假設選擇[s(i),t(i)]不是最優的,而選擇了[s(j),t(j)],(j > i),此時得到的解為k-1。若用[s(i),t(i)]代替[s(j),t(j)],不會影響後面的選擇。此時得到的解仍為k-1,而在假設中,選擇了[s(i),t(i)]的方法不是最優的,所以產生了矛盾。
以上證明,選擇的貪心策略是正確的。
3.本章問題及結對程式設計的總結
貪心演算法相比動態規劃來說,會容易理解一些。最重要的,就是求解問題時如何選擇正確的貪心策略。
結對程式設計:通過前幾次結對程式設計,和隊友之間的合作更加順暢默契,在交流中也能更積極地給對方提供更多的思路,再通過討論確定正確的方案。
第四章(筆記總結)
簡單的組合語言源程式基本語法 assume cs code code segment mov ax 0001h add ax ax mov ax 4c00h int 21h code ends end在組合語言源程式中,包含兩種指令分別是,彙編指令和偽指令 彙編指令 1 mov ax 0001h i...
第四章作業總結
include using namespace std int main cout a endl system pause return 0 注意getchar 不能迴圈條件用一次,算式中再用一次,否則算兩次getchar 只能先設個變數再用。將使用者輸入的任意十進位制整數轉換為16進製制數輸出 利...
第四章總結(一)
字串string類簡介 建立陣列就很簡單了,就直接typename arrayname size 這裡的typename 可以是你自己定義的結構體,也可以是基本資料型別,然後這裡的size如果是在vs編譯器中,必須是常量或者是const變數,這裡的常量是說你直接把size寫死,比如int a 5 但...