在對問題求解時,總是遵循某種規則做出在當前看來是最好的選擇,期待通過所做的區域性最優選擇來產生乙個全域性最優解。
貪心演算法不是對所有問題都能得到整體最優解。
從前有乙隻鵝,一天可以下兩個金蛋,但是在第一天直接殺了它可以拿到二十個金蛋。問如何在21天內拿到盡量多的金蛋?
動態規劃:當n=21時會選擇最後一天殺,能拿到40個金蛋;
貪心演算法:第一天殺,能拿到20個金蛋。
結論:貪心演算法求解的結果不一定是全域性最優解。但對於某些問題來說用貪心演算法剛好能得到全域性最優解。
例子出處
1)貪心選擇性質:所求問題的整體最優解可以通過一系列區域性最優的選擇來得到;
證明方法:
首先考察乙個問題的最優解,證明可修改該最優解,使得其從貪心選擇開始也是最優的,然後用數學歸納法證明每一步都可以通過貪心選擇得到最優解:
①假定首選元素不是貪心選擇所要的元素,證明將首元素替換成貪心選擇所需元素,依然得到最優解;
②數學歸納法證明每一步均可通過貪心選擇得到最優解
2)最優子結構性質:乙個最優策略的子策略總是最優的。
1)分析問題,選擇合適的貪心策略;
2)證明兩個性質;
3)求解。
設有n個活動的集合e=,其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有乙個活動能使用這一資源。每個活動i都有乙個要求使用該資源的起始時間si和乙個結束時間fi,且si 可能的貪心選擇策略:
1)每次選擇開始時間最早的活動;
2)每次選擇活動使用時間最少的活動;
3)每次選擇結束時間最早的活動。
選擇第3)作為貪心選擇策略。
證明:假設有乙個最優解a,其活動是以結束時間非減序進行排列的。再假設a中的第乙個活動是k。通過貪心選擇選擇到的第乙個活動記為活動1。
若k=1,則a是以活動1開始的;
若k≠1,則用活動1替換掉a中的活動k,因為end[1]≤end[k],活動1能與a中其他活動相容,所以證明了總存在乙個以貪心選擇開始的最優活動安排方案,即具有貪心選擇性質。
證明:通過貪心選擇選擇了活動1後,原問題化簡為在剩下的活動中找與活動1相容的活動進行活動安排,也就是若a是原問題的最優解,則a』=a-是活動安排問題e』=e-的最優解,即貪心選擇做出的每一次選擇都會將問題化簡為乙個更小的與原問題具有相同形式的子問題。因此該問題具有最優子結構性質。
#include
#include
using
namespace std;
struct activity
;bool
comp
(activity a,activity b)
void
select
(activity act,
int n)
}int
main()
sort
(act+
1,act+n,comp)
;select
(act,n)
;for
(int i=
1;i<=n;i++)if
(act[i]
.mark==1)
cout<.num<<
" ";}/*
測試案例:
111 4
3 50 6
5 73 8
5 96 10
8 11
8 12
2 13
12 14
*/
計算機演算法設計與分析 工作安排問題
問題描述 設有n件工作分配給n個人,將工作i分配給第j個人所需的費用為cij。試設計乙個演算法,為每個人都分配一件不同的工作,並使得總費用達到最小。輸入 第1行有1個正整數n 1 n 20 接下來的n行,每行n個數,表示工作費用。輸出 計算的最小總費用 樣例輸入 310 2 3 2 3 4 3 4 ...
活動安排問題
作為新一代的好青年肯定會喜歡許多的電視節目,比如說新聞聯播,焦點訪談,又如招聘類的節目有非你莫屬,職來職往,娛樂節目如快樂大本營。現在給你每個節目的開始時間和結束時間,要求你求出看盡可能多的完整節目。每個電視節目i都有乙個起始時間si和乙個結束時間fi,且si 對於活動安排問題可以用貪心演算法解決,...
活動安排問題
活動安排 描述 設有n個活動的集合e 其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有乙個活動能使用這一資源。每個活動i都有乙個要求使用該資源的起始時間si和乙個結束時間fi,且si 輸入 輸入只有乙個用例,第一行為一正整數n,表示活動個數,接下來n行,每行兩個整數,分別表示第i號活...