今天實驗做的是貪心演算法,中午睡醒然後爬了九樓去實驗室,討厭,老師沒有提前發實驗指導書剛開始還是討厭的,因為以前都是提前做好直接過來驗收的,畢竟對自己還是很沒有信心能夠在實驗課上完成實驗的;哎,事實證明確實沒有完成,思路想法都是有的,就是不會用高階語言實現了,難受難受;
說正事吧,貪心演算法,就是目光短淺法,要命的是他需要證明貪心選擇策略(主)和最優子結構性質,我不會!之後需要學習!
例題一問題描述:
設有n 個顧客同時等待一項服務。顧客i需要的服務時間為ti, 1<=i <= n 。應如何安排n個顧客的服務次序才能使平均等待時間達到最小?平均等待時間是n 個顧客等待服務時間的總和除以n。
#include
#include
//56 12 1 99 1000 234 33 55 99 812
int main()
}for(i=0;i
求sum的時候,第乙個使用者在用的時候後面n-1位都等了a[0]time,
第二個使用者在用的時候後面n-2位都等了a[1]time。。。。,剛開始我是想用兩個for迴圈解決,其實換個思路,就能想到a[0]一共有n-1,a[1]一共有n-2......乙個for迴圈結束,簡單不易錯;
例題二
問題描述:
給定x 軸上n 個閉區間。去掉盡可能少的閉區間,使剩下的閉區間都不相交。
#include#include
//3 10 20 10 15 15 20
int main()
}j=0;
for(i=1;i
b[j])
}printf("%d\n",sum);
return 0;
}
例題三
問題描述:
一輛汽車加滿油後可行駛nkm。旅途中有若干加油站。設計乙個有效演算法,指出應在哪些加油站停靠加油,使沿途加油次數最少。
演算法設計:對於給定的n和k個加油站位置,計算最少加油次數。
資料輸入:n:表示汽車加滿油後可行駛nkm
k:旅途中有
k個加油站
k+1個整數:表示第
k個加油站與第
k-1個加油站之間的距離
。第0個加油站表示出發地,汽車已加滿油。第k+1個加油站表示目的地。
資料輸出:最少加油次數和具體在哪幾個加油站加油。
#include
#include
//1 2 3 4 5 1 6 6
void greedy(int a,int n,int k)
}printf("╪ссмё╣у╬ё╨");
for(i=1;i<=num;i++)
printf("╪ссму╬%d ",b[i]);
printf("\n");
printf("%d\n",num);
}int main()
就是這題卡了我半節課,最後也沒有驗收, s = a[i];我之前寫的是 s = 0;我想用乙個下標記住需要加油的加油站的位置,然後sum從此處累加,用了while 也用了for迴圈都沒能解決,最後還是看**吧;
例題四[均分紙牌]有n堆紙牌,編號分別為1,2,…,n。每堆上有若干張,但紙牌總數必為n的倍數.可以在任一堆上取若干張紙牌,然後移動。移牌的規則為:在編號為1上取的紙牌,只能移到編號為2的堆上;在編號為n的堆上取的紙牌,只能移到編號為n-1的堆上;其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。現在要求找出一種移動方法,用最少的移動次數使每堆上紙牌數都一樣多。例如:n=4,4堆紙牌分別為:① 9 ② 8 ③ 17 ④ 6 移動三次可以達到目的:從③取4張牌放到④ 再從③區3張放到②然後從②去1張放到①。
#include
#include
int main()
if(n==a[k])
for(i=0;i
貪心演算法(1)
貪心演算法是求解最優解的一類問題,在貪心演算法中,每一步求解的都是最優解,但是整體來說不一定是最優的。在求解貪心演算法時,首先要通過題目總結出貪心準則,利用貪心準則進行求解。前兩天看了牛客網,準備通過考研複習空閒時間學習一下演算法,提高程式設計能力,不至於手生。下面是一道貪心演算法的題 時間限制 1...
貪心演算法1
一 基本概念 所謂貪心演算法是指,在對問題求解時,總是做出在 當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的 區域性最優解。貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略...
貪心演算法1
1 學前須知 這是一種求最優解的方法。它是按照某種最優策略,將複雜問題層層分解成子問題 每次一般只有乙個 並由子問題的最優解 回溯 出整個問題的最優解。貪心演算法不是從整體上考慮問題,它所做出的選擇只是在某種意義上的區域性最優解,而由問題自身的特性決定了該題運用貪心演算法可以得到最優解。如果乙個問題...