一看就懂的貪心演算法,不懂打我

2021-10-04 20:48:25 字數 2131 閱讀 6447

小結貪心(貪婪)演算法是一種非常神奇的演算法,下面講解一下:

貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解

貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關

貪心選擇是指所求問題的整體最優解可以通過一系列區域性最優的選擇,即貪心選擇來達到。這是貪心演算法可行的第乙個基本要素,也是貪心演算法與動態規劃演算法的主要區別。貪心選擇是採用從頂向下、以迭代的方法做出相繼選擇,每做一次貪心選擇就將所求問題簡化為乙個規模更小的子問題。對於乙個具體問題,要確定它是否具有貪心選擇的性質,我們必須證明每一步所作的貪心選擇最終能得到問題的最優解。通常可以首先證明問題的乙個整體最優解,是從貪心選擇開始的,而且作了貪心選擇後,原問題簡化為乙個規模更小的類似子問題。然後,用數學歸納法證明,通過每一步貪心選擇,最終可得到問題的乙個整體次優解(因為不一定是最優)

不管什麼演算法,沒有例題詳解都不厲害。下面立刻掏出例題。

題目:加工生產排程

某工廠收到了 n 個產品的訂單,這 n 個產品分別在 a、b 兩個車間加工,並且必須先在 a 車間加工後才可以到 b 車間加工。

某個產品 i 在 a,b 兩車間加工的時間分別為 ai,bi。怎樣安排這 n 個產品的加工順序,才能使總的加工時間最短。

這裡所說的加工時間是指:從開始加工第乙個產品到最後所有的產品都已在 a,b 兩車間加工完畢的時間。

input

第一行僅—個資料 n ,表示產品的數量;

接下來 n 個資料是表示這 n 個產品在 a 車間加工各自所要的時間;

最後的 n 個資料是表示這 n 個產品在 b 車間加工各自所要的時間。

output

第一行乙個資料,表示最少的加工時間;

第二行是一種最小加工時間的加工順序。

example

樣例輸入

53 5 8 7 10

6 2 1 4 9

樣例輸出

341 5 4 2 3

hint

對於 100%的資料, 0思路

首先嘛,肯定是要讓a,b兩個車間不要閒下來,最好一直工作,所以a一開始先工作乙個最短的給b,最後就是a幹完了,看著b繼續。。。

**

#include

using

namespace std;

const

int maxn=

1000

;struct nodee[maxn]

;int n,stk[maxn]

,top;

bool

cmp(node& x,node &y)

void

prt(

int tb)

}void

solve()

prt(tb);}

intmain()

for(

int i=

1;i<=n;i++

)sort

(e+1

,e+n+

1,cmp)

;solve()

;return0;

}

說到這裡大家應該知道了,貪心並不是一種絕對得到最優解的演算法,但是在某些題中,比如一道經典的題目:旅行商問題(tsp問題)就要用到。

題目是這樣的:

有乙個商品推銷員,要去若干個城市推銷商品。該推銷員從乙個城市出發,需要經過所有城市後,回到出發地。每個城市之間都有道路連通,且距離各不相同,推銷員應該如何選擇路線,使得總行程最短呢?

這一題就非常的bian tai了,仔細一想,這一題的演算法複雜度是o(n!),就是

o(n * (n-1) * (n-2) * … * 3 * 2 * 1)了,這可是指數級別啊!

掏出計算器一按20!=243 2902 0081 7664 0000,態度相當惡劣啊。但是,用貪心就很舒服了,雖然得到的有可能不是最優解,反正也差不了多少~為什麼要鑽牛角尖捏?在比賽時一部分的最優解題目不會就可以使用貪心來做,有可能會多得到幾個的測試點。

演算法一看就懂之 堆疊

一 堆疊 是什麼?堆疊 stack 是一種先進後出的 操作受限的線性表,也可以直接稱為棧。可以把棧想象成乙個桶一樣,往這個桶裡面一層一層的放東西,先放進去的在裡面,後放進去的東西依次在外面。但取東西的時候就是先取靠近外面的,再依次一層層取裡面的。這就是 後進先出 last in first out ...

一看就懂的SwitchHosts

switchhosts 是乙個管理 切換多個 hosts 方案的工具。它是乙個免費開源軟體。日常開發工作中,我們可能經常需要切換各種 hosts 繫結,比如在本地開發時可能需要乙個開發環境的 hosts 繫結方案,發布到測試環境後又有乙個測試環境的 hosts 繫結方案,然後可能還有乙個預發布環境,...

一看就懂TCP 連線

我們先來看乙個定義。這樣理解比較抽象。我們換個角度。它的本質還是傳輸控制。如果讓我們自己設計這個傳輸,我們會怎麼想呢。tcp 協議它會先建立連線。三次握手目的是保證雙方都有傳送和接收的能力 首要原因是為了防止舊的重複連線初始化造成混亂。同步雙方初始序列號客戶端和服務端都處於 closed 狀態。先是...