當前位置:首頁 » 操作系統 » 貪心演算法

貪心演算法

發布時間: 2022-01-11 02:45:43

1. c語言問題急!!!(用貪心演算法

這個問題不是很難,我寫了就怕你看不懂,不懂問我啊,4個循環就可以了.
qq 64924930
調試通過!
main()
{
int i,a[5],b[4],c[4];
/* define the type of the money*/
a[1]=25;
a[2]=10;
a[3]=5;
a[4]=1;

printf("please input you money (fen):\n");
scanf("%d",&b[0]);
for (i=1;i<=4;i++)
{
b[i]=b[i-1]%a[i]; /*take n 25 off and money left*/
c[i]=(b[i-1]-b[i])/a[i]; /* n */
printf("%d is %d\n",a[i],c[i]);
}
getch();
}

2. 什麼是貪心演算法

貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的局部最優解。貪心演算法不是對所有問題都能得到整體最優解,但對范圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。

3. 哪些常見演算法屬於貪婪演算法

顯然KMP和FLOYD演算法不是貪心演算法,FLOYD演算法是使用了類似於動態規劃的思想,而KMP演算法則是對串的前綴進行去處理得到所有可能出現匹配的位置從而減少不必要的位移。貪心演算法可能還有很多,但是一般能用到的可能只有這些。在確定一個問題是否能用貪心來解決的時候應該線能夠證明在這里使用貪心演算法的正確性(詳見演算法導論)

4. 貪心演算法

平面點集三角剖分的貪心演算法要求三角剖分後邊的總長度盡可能小。演算法的基本思想是將所有的兩點間距離從小到大排序,依次序每次取一條三角剖分的邊,直至達到要求的邊數。以下是兩種貪心演算法的主要步驟。

3.2.2.1 貪心演算法1

第一步:設置一個記錄三角剖分中邊的數組T。

第二步:計算點集S中所有點對之間的距離d(pi,pj),1≤i,j≤n,i≠j,並且對距離從小到大進行排序,設為d1,d2,…,dn(n-1)/2,相應的線段記為e1,e2,…,en(n-1)/2,將這些線段存儲在數組E中。

第三步:從線段集E中取出長度最短的邊e1存到T中作為三角剖分的第一條邊,此時k=1。

第四步:依次從E中取出長度最短的邊ek,與T中已有的邊進行求交運算,如果不相交則存到T中,並從E中刪除ek。這一步運行到S中沒有邊為止,即至k=n(n-1)/2。

第五步:輸出T。

該演算法中,第二步需要計算n(n-1)/2次距離,另外距離排序需要O(n2lgn)次比較。T中元素隨第四步循環次數的增加而增加,因此向T中加入一條新邊所需要的判定兩條線段是否相交的次數也隨之增加。如果第四步的前3n-6次循環後已經構成點集的三角剖分,那麼第四步循環所需要的判定兩條線段是否相交的次數為

1+2+…+3n-7+(3n-6)×(n(n-1)/2-(3n-6))=O(n3)

在常數時間內可以判定兩條線段是否相交,因此該演算法的時間復雜性為O(n3)。

3.2.2.2 貪心演算法2

第一步:求點集的凸殼,設凸殼頂點為p1,p2,…,pm,凸殼的邊為e1,e2,…,em。並將凸殼頂點按順序連接成邊的ei加入T(三角剖分的邊集合),並且ei的權值被賦為1。凸殼內點的集合為S1={pm+1,pm+2,…,pn}。

第二步:從內部點S1中任取一點pi,求與pi距離最近的點pj,將線段 存入T。

第三步:求與pj距離最近的點(除點pi外),設為pk,並將線段 加入T,並將這些邊的權值設為1,而wij、wjk和wki的值加1,即為2。邊的權值為2則表示該邊為兩個三角形共有。

第五步:對權值為1的邊(除e1,e2,…,em外)的兩個端點分別求與其距離最近的點,並將其連線(得到新的三角形)加入T,新三角形邊的權值加1。

第六步:對權值為1的邊重復上一步,當一條邊被使用一次其權值增加1,直到所有邊的權值均為2為止(除e1,e2,…,em外)。

貪心演算法2中,第一步耗費O(nlgn);第二步需要計算n-1次距離與n-2次比較;第三步求pk要計算n-2次的距離與n-3次比較;第四步要進行(n-3)×3次的距離計算及(n-4)×3次比較;第五步至多進行n-6次的距離計算與n-7次比較;第六步到第五步的循環次數不超過3n-9;因此整個貪心演算法2的時間復雜性為

O(nlgn)+O(n)+O(n)+O(n)+(n-6)×(3n-9)=O(n2)

5. 貪心演算法的基本思路

1.建立數學模型來描述問題
⒉把求解的問題分成若干個子問題。
⒊對每一子問題求解,得到子問題的局部最優解。
⒋把子問題的解局部最優解合成原來解問題的一個解。
實現該演算法的過程:
從問題的某一初始解出發;
while 能朝給定總目標前進一步
do
求出可行解的一個解元素;
由所有解元素組合成問題的一個可行解。
下面是一個可以試用貪心演算法解的題目,貪心解的確不錯,可惜不是最優解。

6. 貪心演算法 活動安排問題

這道題的貪心演算法比較容易理解,我就不多說明了,只是提到一下演算法思路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注釋我盡力寫了,希望對你有幫助。

7. 關於編程的貪心法

定義
所謂貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的局部最優解。 貪心演算法不是對所有問題都能得到整體最優解,但對范圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。
[編輯本段]貪心演算法的基本思路
1.建立數學模型來描述問題。 2.把求解的問題分成若干個子問題。 3.對每一子問題求解,得到子問題的局部最優解。 4.把子問題的解局部最優解合成原來解問題的一個解。 實現該演算法的過程: 從問題的某一初始解出發; while 能朝給定總目標前進一步 do 求出可行解的一個解元素; 由所有解元素組合成問題的一個可行解。 下面是一個可以試用貪心演算法解的題目,貪心解的確不錯,可惜不是最優解。
[編輯本段]例題分析
[背包問題]有一個背包,背包容量是M=150。有7個物品,物品不可以分割成任意大小。 要求盡可能讓裝入背包中的物品總價值最大,但不能超過總容量。 物品 A B C D E F G 重量 35 30 60 50 40 10 25 價值 10 40 30 50 35 40 30 分析: 目標函數: ∑pi最大 約束條件是裝入的物品總重量不超過背包容量:∑wi<=M( M=150) (1)根據貪心的策略,每次挑選價值最大的物品裝入背包,得到的結果是否最優? (2)每次挑選所佔重量最小的物品裝入是否能得到最優解? (3)每次選取單位重量價值最大的物品,成為解本題的策略。 值得注意的是,貪心演算法並不是完全不可以使用,貪心策略一旦經過證明成立後,它就是一種高效的演算法。 貪心演算法還是很常見的演算法之一,這是由於它簡單易行,構造貪心策略不是很困難。 可惜的是,它需要證明後才能真正運用到題目的演算法中。 一般來說,貪心演算法的證明圍繞著:整個問題的最優解一定由在貪心策略中存在的子問題的最優解得來的。 對於例題中的3種貪心策略,都是無法成立(無法被證明)的,解釋如下: (1)貪心策略:選取價值最大者。 反例: W=30 物品:A B C 重量:28 12 12 價值:30 20 20 根據策略,首先選取物品A,接下來就無法再選取了,可是,選取B、C則更好。 (2)貪心策略:選取重量最小。它的反例與第一種策略的反例差不多。 (3)貪心策略:選取單位重量價值最大的物品。 反例: W=30 物品:A B C 重量:28 20 10 價值:28 20 10 根據策略,三種物品單位重量價值一樣,程序無法依據現有策略作出判斷,如果選擇A,則答案錯誤。 【注意:如果物品可以分割為任意大小,那麼策略3可得最優解】 對於選取單位重量價值最大的物品這個策略,可以再加一條優化的規則:對於單位重量價值一樣的,則優先選擇重量小的!這樣,上面的反例就解決了。 但是,如果題目是如下所示,這個策略就也不行了。 W=40 物品:A B C 重量:28 20 15 價值:28 20 15 附:本題是個NP問題,用貪心法並不一定可以求得最優解,以後了解了動態規劃演算法後本題就有了新的解法。
[編輯本段]備注
貪心演算法當然也有正確的時候。求最小生成樹的Prim演算法和Kruskal演算法都是漂亮的貪心演算法。 所以需要說明的是,貪心演算法可以與隨機化演算法一起使用,具體的例子就不再多舉了。(因為這一類演算法普及性不高,而且技術含量是非常高的,需要通過一些反例確定隨機的對象是什麼,隨機程度如何,但也是不能保證完全正確,只能是極大的幾率正確)
[編輯本段]附貪心演算法成功案例之一
馬踏棋盤的貪心演算法 123041-23 XX 【問題描述】 馬的遍歷問題。在8×8方格的棋盤上,從任意指定方格出發,為馬尋找一條走遍棋盤每一格並且只經過一次的一條最短路徑。 【初步設計】 首先這是一個搜索問題,運用深度優先搜索進行求解。演算法如下: 1、 輸入初始位置坐標x,y; 2、 步驟 c: 如果c> 64輸出一個解,返回上一步驟c-- (x,y) ← c 計算(x,y)的八個方位的子結點,選出那此可行的子結點 循環遍歷所有可行子結點,步驟c++重復2 顯然(2)是一個遞歸調用的過程,大致如下: void dfs(int x,int y,int count) { int i,tx,ty; if(count> N*N) { output_solution();//輸入一個解 return; }

8. 貪心演算法 動態規劃 它們有什麼區別程序設計

這個很簡單啦,貪心演算法是為了使得每一步都得到最好的,而最後的結果卻不一定是最好的。
但是動態規劃求出的肯定是最優解!!!!

9. 貪心演算法問題

//身為大一菜鳥的我曾錯了n次的題
//演算法是從頭開始掃過去,若當前掃到的數比下一個大,則刪,刪後回退到上一個未被刪的數繼續,直到刪完指定數或掃到最後一個元素,若刪不夠指定的數,則此刻數組肯定是遞增的,所以只要從後向前刪至足夠數量便行了

#include<iostream>
#include<string.h>
using namespace std;
char str[250];
int a[250];
int b[250];

int main(){
int i, len, k, l, r, c, t, f;
do{
f = 0;
cin >> str;
if (str[0] == '0')
break;
len = strlen(str);
cin >> k;
for (i = 0; i<250; i++){
a[i] = i + 1;
b[i] = i - 1;
}
c = 0;
l = 0;
for (r = 1; str[r] != '\0';){
if (c >= k)
break;
if (str[r] - str[l] >= 0){
l = a[l];
r = a[r];
}
else{
c++;
if (b[l] != -1){
a[b[l]] = r;
b[r] = b[l];
l = b[l];
}
else{
f = 1;
b[r] = -1;
a[0] = r;
l = a[l];
r = a[r];
}
}
}
t = r - 1;
for (; c<k; c++){
a[b[t]] = r;
t = b[t];
}
if (f == 0)
cout << str[0];
i = 0;
for (i = a[i]; i<len; i = a[i]){
cout << str[i];
}
cout << endl;
} while (1);
return 0;
}

熱點內容
上傳文件文件夾找不到 發布:2024-09-20 00:26:32 瀏覽:914
承台箍筋加密區 發布:2024-09-20 00:26:31 瀏覽:227
筆記本什麼配置能流暢運行cf 發布:2024-09-20 00:14:19 瀏覽:951
實測華為編譯器 發布:2024-09-19 23:50:52 瀏覽:821
linux匯總 發布:2024-09-19 23:46:39 瀏覽:452
阿里雲伺服器環境搭建教程 發布:2024-09-19 23:21:58 瀏覽:837
黃色文件夾圖標 發布:2024-09-19 23:19:22 瀏覽:684
mysql資料庫導出導入 發布:2024-09-19 23:00:47 瀏覽:183
lua腳本精靈 發布:2024-09-19 23:00:41 瀏覽:659
任務欄文件夾圖標 發布:2024-09-19 22:54:25 瀏覽:101