參貪心演算法
⑴ 貪心演算法 活動安排問題
這道題的貪心演算法比較容易理解,我就不多說明了,只是提到一下演算法思路1、建立數學模型描述問題。我在這里將時間理解成一條直線,上面有若干個點,可能是某些活動的起始時間點,或終止時間點。在具體一下,如果編程來實現的話,將時間抽象成鏈表數組,數組下標代表其實時間,該下標對應的鏈表代表在這個時間起始的活動都有哪些,具體參照程序注釋。2、問題分解。為了安排更多的活動,那麼每次選取佔用時間最少的活動就好。那麼從一開始就選取結束時間最早的,然後尋找在這個時間點上起始的活動,以此類推就可以找出貪心解。程序代碼:#include<stdio.h>
struct inode //自定義的結構體
{
int end; //表示結束時間
inode *next; //指向下一個節點的指針
};int main()
{
inode start[10001],*pt;
int a,b,i,num=0; //num負責計數,i控制循環,a,b輸入時候使用
for(i=0;i<10001;i++) //初始化
{
start[i].next=NULL;
}
while(scanf("%d %d",&a,&b)) //輸入並建立數據結構
{
if(a==0&&b==0) break;
pt=new inode; //創建新的節點,然後將該節點插入相應的位置
pt->end=b;
pt->next=start[a].next;
start[a].next=pt;
}
i=0;
while(i<10001) //進行貪心演算法,i表示當前時間
{
if(start[i].next==NULL)
{
i++; //該時間無活動開始
}
else
{
int temp=10001; //臨時變數,存儲該鏈表中最早的終止時間
for(pt=start[i].next;pt!=NULL;pt=pt->next)
{
if(pt->end<temp)
{
temp=pt->end;
}
}
i=temp; //將當前時間設置成前一子問題的終止時間
num++;
}
}
printf("%d\n",num); //列印結果
return 0;
}代碼並不一定是最快速的,但是可以求出貪心解,如果你做的是ACM編程題目,不保證能AC注釋我盡力寫了,希望對你有幫助。
⑵ 程序員都應該精通的六種演算法,你會了嗎
對於一名優秀的程序員來說,面對一個項目的需求的時候,一定會在腦海里浮現出最適合解決這個問題的方法是什麼,選對了演算法,就會起到事半功倍的效果,反之,則可能會使程序運行效率低下,還容易出bug。因此,熟悉掌握常用的演算法,是對於一個優秀程序員最基本的要求。
那麼,常用的演算法都有哪些呢?一般來講,在我們日常工作中涉及到的演算法,通常分為以下幾個類型:分治、貪心、迭代、枚舉、回溯、動態規劃。下面我們來一一介紹這幾種演算法。
一、分治演算法
分治演算法,顧名思義,是將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。
分治演算法一般分為三個部分:分解問題、解決問題、合並解。
分治演算法適用於那些問題的規模縮小到一定程度就可以解決、並且各子問題之間相互獨立,求出來的解可以合並為該問題的解的情況。
典型例子比如求解一個無序數組中的最大值,即可以採用分治演算法,示例如下:
def pidAndConquer(arr,leftIndex,rightIndex):
if(rightIndex==leftIndex+1 || rightIndex==leftIndex){
return Math.max(arr[leftIndex],arr[rightIndex]);
}
int mid=(leftIndex+rightIndex)/2;
int leftMax=pidAndConquer(arr,leftIndex,mid);
int rightMax=pidAndConquer(arr,mid,rightIndex);
return Math.max(leftMax,rightMax);
二、貪心演算法
貪心演算法是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的局部最優解。
貪心演算法的基本思路是把問題分成若干個子問題,然後對每個子問題求解,得到子問題的局部最優解,最後再把子問題的最優解合並成原問題的一個解。這里要注意一點就是貪心演算法得到的不一定是全局最優解。這一缺陷導致了貪心演算法的適用范圍較少,更大的用途在於平衡演算法效率和最終結果應用,類似於:反正就走這么多步,肯定給你一個值,至於是不是最優的,那我就管不了了。就好像去菜市場買幾樣菜,可以經過反復比價之後再買,或者是看到有賣的不管三七二十一先買了,總之最終結果是菜能買回來,但搞不好多花了幾塊錢。
典型例子比如部分背包問題:有n個物體,第i個物體的重量為Wi,價值為Vi,在總重量不超過C的情況下讓總價值盡量高。每一個物體可以只取走一部分,價值和重量按比例計算。
貪心策略就是,每次都先拿性價比高的,判斷不超過C。
三、迭代演算法
迭代法也稱輾轉法,是一種不斷用變數的舊值遞推新值的過程。迭代演算法是用計算機解決問題的一種基本方法,它利用計算機運算速度快、適合做重復性操作的特點,讓計算機對一組指令(或一定步驟)進行重復執行,在每次執行這組指令(或這些步驟)時,都從變數的原值推出它的一個新值。最終得到問題的結果。
迭代演算法適用於那些每步輸入參數變數一定,前值可以作為下一步輸入參數的問題。
典型例子比如說,用迭代演算法計算斐波那契數列。
四、枚舉演算法
枚舉演算法是我們在日常中使用到的最多的一個演算法,它的核心思想就是:枚舉所有的可能。枚舉法的本質就是從所有候選答案中去搜索正確地解。
枚舉演算法適用於候選答案數量一定的情況。
典型例子包括雞錢問題,有公雞5,母雞3,三小雞1,求m錢n雞的所有可能解。可以採用一個三重循環將所有情況枚舉出來。代碼如下:
五、回溯演算法
回溯演算法是一個類似枚舉的搜索嘗試過程,主要是在搜索嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。
許多復雜的,規模較大的問題都可以使用回溯法,有「通用解題方法」的美稱。
典型例子是8皇後演算法。在8 8格的國際象棋上擺放八個皇後,使其不能互相攻擊,即任意兩個皇後都不能處於同一行、同一列或同一斜線上,問一共有多少種擺法。
回溯法是求解皇後問題最經典的方法。演算法的思想在於如果一個皇後選定了位置,那麼下一個皇後的位置便被限制住了,下一個皇後需要一直找直到找到安全位置,如果沒有找到,那麼便要回溯到上一個皇後,那麼上一個皇後的位置就要改變,這樣一直遞歸直到所有的情況都被舉出。
六、動態規劃演算法
動態規劃過程是:每次決策依賴於當前狀態,又隨即引起狀態的轉移。一個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。
動態規劃演算法適用於當某階段狀態給定以後,在這階段以後的過程的發展不受這段以前各段狀態的影響,即無後效性的問題。
典型例子比如說背包問題,給定背包容量及物品重量和價值,要求背包裝的物品價值最大。
⑶ 甯哥敤鐨勭畻娉曠瓥鐣ュ寘鎷
甯哥敤鐨勭畻娉曠瓥鐣ュ寘鎷浠ヤ笅鍑犱釜鏂歸潰錛
1銆佽椽蹇冪畻娉曪細璐蹇冪畻娉曟槸涓縐嶅湪姣忎竴姝ラ夋嫨涓閮介噰鍙栧湪褰撳墠鐘舵佷笅鏈濂芥垨鏈浼橈紙鍗蟲渶鏈夊埄錛夌殑閫夋嫨錛屼粠鑰屽笇鏈涘艱嚧緇撴灉鏄鏈濂芥垨鏈浼樼殑綆楁硶銆傝椽蹇冪畻娉曠殑鎬濊礬鏄浠庨棶棰樼殑灞閮ㄦ渶浼樿В鍑哄彂錛屽敖鍙鑳藉湴瀹炵幇鍏ㄥ矓鏈浼樿В銆傝椽蹇冪畻娉曞苟涓嶄竴瀹氳兘寰楀埌鏈浼樿В錛屼絾瀹冨彲浠ュ湪澶氶」寮忔椂闂村唴瑙e喅璁稿氶棶棰橈紝濡傛渶灝忕敓鎴愭爲銆佹渶鐭璺寰勭瓑銆
2銆佺墿嫻侀嗗煙錛氬湪鐗╂祦棰嗗煙涓錛岀畻娉曠瓥鐣ュ彲浠ョ敤浜庝紭鍖栬繍杈撹礬綰褲侀檷浣庤繍杈撴垚鏈鍜屾彁楂樿繍杈撴晥鐜囥備緥濡傦紝閫氳繃鍔ㄦ佽勫垝綆楁硶錛屽彲浠ユ牴鎹璐х墿鐨勭洰鐨勫湴鍜岃繍杈撻渶奼傦紝鍚堢悊瀹夋帓璐х墿鐨勮呰澆鍜岃繍杈撹礬綰匡紝鎻愰珮榪愯緭鏁堢巼騫墮檷浣庢垚鏈銆
3銆佷漢宸ユ櫤鑳介嗗煙錛氱畻娉曠瓥鐣ユ槸浜哄伐鏅鴻兘棰嗗煙涓鐨勯噸瑕佺粍鎴愰儴鍒嗭紝鍙浠ョ敤浜庢満鍣ㄥ︿範銆佽嚜鐒惰璦澶勭悊銆佽$畻鏈鴻嗚夌瓑棰嗗煙銆備緥濡傦紝鍦ㄦ満鍣ㄥ︿範涓錛岄氳繃璐蹇冪畻娉曞拰鍔ㄦ佽勫垝綆楁硶絳夌瓥鐣ワ紝鍙浠ヨ緇冩ā鍨嬪苟浼樺寲妯″瀷鍙傛暟錛屾彁楂樻ā鍨嬬殑鍑嗙『鎬у拰娉涘寲鑳藉姏銆
⑷ 貪婪演算法指的是什麼
貪心演算法是指在對問題進行求解時,在每-步選擇中都採取最好或者最優(即最有利)的選擇,從而希望能夠導致結果是最好或者最優的。
貪婪演算法所得到的結果不一定是最優的結果(有時候會是最優解),但是都是相對近似(接近)最優解的結果。
例題、區間問題
問題描述:有n項工作,每項工作分別在si開始,ti結束。對每項工作,你都可以選擇參加或不參加,但選擇了參加某項工作就必須至始至終參加全程參與。
即參與工作的時間段不能有重疊(即使開始的時間和結束的時間重疊都不行)。限制條件:1<=n<=1000001<=si<=ti,=109樣例:輸入51 2 4 6 83 5 7 9 10輸出3(選擇工作1, 3, 5)。