之前做了很多貪心演算法,他們都能找到最優解,這也是之所以用貪心演算法的原因。貪心演算法較之其他,最大的優勢體現在時間複雜度低,空間複雜度也比較低。對於試用貪心演算法的題型,
有兩個重要特徵:貪心策略與最優子結構。貪心策略即每步採取策略的依據;最優子結構則是指問題的求解可以轉化為求解子問題的最優解。這點與動態規劃有點像,但後者要列舉問題的解空
間,資源消耗很大。
貪心演算法不一定保證得到最優解,但很多時候用其他方法的無效(有的是確實沒有解決方法,有的是複雜度難以接受),在這種情況下我們可以嘗試用近似演算法,根據一定的有效貪心策略,
哪怕得不到最優解,但權衡之下也是可以接受的。
例如給定若干物品,要求盡可能的將它們分成質量相近的兩堆。如物品數為5,重量分別為3,3,2,2,2,很容易根據經驗判斷分成3+3和2+2+2的兩堆。但這是乙個2^n級難題,資料量一大就出
現組合**。解決該問題目前還沒有無有效的方法。列舉法可以得到最優解,但時間複雜度為o(2^n),難以接受。下面是n<=15時的列舉法,用位操作簡化計算。
#include
#include
using namespace std;
const int maxn=20;
int w[maxn];
int used[maxn];
const int inf=1<<30;
int n,id,sum;
int solve()
else b+=w[i]; }}
int main()
{ cin>>n;
memset(used,0,sizeof(used));
for(int i=0;i>w[i];
solve();
printf("\n第一堆為:");
for(int i=0;i執行結果為:2+2+3=7 2+3=7
在有些情況下是完全可以接受近似演算法的。
近似演算法 貪心演算法與近似演算法
1.1 教室排程問題 假設有如下課程表,你希望將盡可能多的課程安排在某間教室上。你沒法讓這些課都在這間教室上,因為有些課的上課時間有衝突。你希望在這間教室上盡可能多的課。如何選出盡可能多且時間不衝突的課程呢?這個問題好像很難,不是嗎?實際上,演算法可能簡單得讓你大吃一驚。具體做法如下。1 選出結束最...
格雷厄姆演算法講解
格雷厄姆演算法是找到點堆的最小凸包演算法 學習格雷厄姆演算法,需要你掌握兩個知識點 1.角排序 2.叉積 首先在一堆點裡選乙個點作為原點 我的選擇方式是橫座標最小或者縱座標最小,因為橫縱座標取極值的情況一定是在凸包上的,自己理解 把這個點記做點o 然後把所有的點與o連線,根據所有線與水平線的夾角排序...
貪心演算法之prim演算法
演算法思想 首先置s 然後只要s是v的真子集,就做如下的貪心選擇 選擇滿足條件i屬於s,j屬於v s,且edge i j 是最小的邊,就將其頂點j新增到s中,這個過程一直進行到s v時為止,在這個過程中,選取到的所有邊恰好構成g的一顆最小生成樹。include define infinity 500...