C++貪心算法實(shí)現(xiàn)活動(dòng)安排問(wèn)題(實(shí)例代碼)
貪心算法
貪心算法(又稱貪婪算法)是指,在對(duì)問(wèn)題求解時(shí),總是做出在當(dāng)前看來(lái)是最好的選擇。也就是說(shuō),不從整體最優(yōu)上加以考慮,他所做出的是在某種意義上的局部最優(yōu)解。
貪心算法不是對(duì)所有問(wèn)題都能得到整體最優(yōu)解,關(guān)鍵是貪心策略的選擇,選擇的貪心策略必須具備無(wú)后效性,即某個(gè)狀態(tài)以前的過(guò)程不會(huì)影響以后的狀態(tài),只與當(dāng)前狀態(tài)有關(guān)。
具體代碼如下所示:
#include <cstdio>
#include <iostream>
#include <ctime>
#include <windows.h>
#include <algorithm>
#include <fstream>
using namespace std;
struct activity
{
int no;
int start;
int finish;
};
bool cmp(const activity &x, const activity &y)
{
return x.finish<y.finish;//從小到大排<,若要從大到小排則>
}
int greedySelector(int m,int solution[],struct activity activity[]){
int number = 1;
solution[0] = 1;
int i,j = 0,counter = 1;
for(i = 1;i < m ;i++)
{
if(activity[i].start >=activity[j].finish)
{
solution[i] = 1;
j = i;
counter++;
}
else
solution[i] = 0;
}
cout << "The amount of activities is:"<<counter<<endl;
cout << "The solution is:";
for(i = 0 ;i < m ;i++)
{
if (solution[i] == 1)
{
cout << activity[i].no <<" ";
}
}
return counter;
}
int main(void)
{
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
ofstream fout;
srand((unsigned int)time(NULL));
int m,i,j,t;
double cost;
cout << "Please enter the number of times you want to run the program:";
cin >> t;
fout.open("activity.txt",ios::app);
if(!fout){
cerr<<"Can not open file 'activity.txt' "<<endl;
return -1;
}
fout.setf(ios_base::fixed,ios_base::floatfield); //防止輸出的數(shù)字使用科學(xué)計(jì)數(shù)法
for (j = 0;j < t;j++)
{
cout << "——————————————————The "<< j + 1 << "th test —————————————————"<<endl;
m = 1 + rand()%100000;
fout<<m<<",";
int solution[m];
activity activity[m];
for( i = 0;i < m;i++)
{
activity[i].no = i+1;
activity[i].start = 1 + rand()%1000;
while(1)
{
activity[i].finish = 1 + rand()%10000;
if(activity[i].finish > activity[i].start) break;
}
}
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime);
sort(activity,activity+m,cmp);
greedySelector(m,solution,activity);
QueryPerformanceCounter(&nEndTime);
cost=(double)(nEndTime.QuadPart - nBeginTime.QuadPart) / (double)nFreq.QuadPart;
fout << cost << endl;
cout << "\nThe running time is:" << cost << " s" << endl;
}
fout.close();
cout << endl << endl;
cout << "Success!" << endl;
return 0;
}
總結(jié)
以上所述是小編給大家介紹的C++貪心算法實(shí)現(xiàn)活動(dòng)安排問(wèn)題,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
VisualStudio Community2019在安裝的過(guò)程中無(wú)法進(jìn)入安裝界面的解決方法
這篇文章主要介紹了VisualStudio Community2019在安裝的過(guò)程中無(wú)法進(jìn)入安裝界面的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
C語(yǔ)言調(diào)用攝像頭實(shí)現(xiàn)生成yuv未壓縮圖片
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何調(diào)用攝像頭實(shí)現(xiàn)生成yuv未壓縮圖片,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以參考一下2023-11-11
關(guān)于C++中定義比較函數(shù)的三種方法小結(jié)
下面小編就為大家?guī)?lái)一篇關(guān)于C++中定義比較函數(shù)的三種方法小結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10
C++實(shí)現(xiàn)掃雷小游戲(控制臺(tái))
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
深入淺析C/C++語(yǔ)言結(jié)構(gòu)體指針的使用注意事項(xiàng)
這篇文章主要介紹了C/C++語(yǔ)言結(jié)構(gòu)體指針的使用,大家都知道指針在32位系統(tǒng)占用4Byte,在64位系統(tǒng)占用8Byte,下面看下c語(yǔ)言代碼例子2021-12-12
數(shù)據(jù)結(jié)構(gòu) 數(shù)組順序存儲(chǔ)詳細(xì)介紹
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 數(shù)組順序存儲(chǔ)詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-05-05

