贪心算法
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
具体代码如下所示:
#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); //防止输出的数字使用科学计数法 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; }
总结
以上所述是小编给大家介绍的C++贪心算法实现活动安排问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
本文向大家介绍C++ 搬水果贪心算法实现代码,包括了C++ 搬水果贪心算法实现代码的使用技巧和注意事项,需要的朋友参考一下 C++ 搬水果贪心算法实现代码 (1)题目描述: 在一个果园里,小明已经将所有的水果打了下来,并按水果的不同种类分成了若干堆,小明决定把所有的水果合成一堆。每一次合并,小明可以把两堆水果合并到一起,消耗的体力等于两堆水果的重量之和。当然经过 n‐1 次合并之后,就变成
本文向大家介绍c语言来实现贪心算法之装箱问题,包括了c语言来实现贪心算法之装箱问题的使用技巧和注意事项,需要的朋友参考一下 装箱问题,贪心算法求近似最优解 以上就是本文的全部内容了,希望大家能够喜欢。
本文向大家介绍采用C++实现区间图着色问题(贪心算法)实例详解,包括了采用C++实现区间图着色问题(贪心算法)实例详解的使用技巧和注意事项,需要的朋友参考一下 本文所述算法即假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有活动。采用C++的贪心算法,来确定哪一个活动使用哪一间教室。 对于这个问题也常被称为区间图着色问题,即相容的活动着同色,不相容的着不同颜色,使得所用颜色
本文向大家介绍python 贪心算法的实现,包括了python 贪心算法的实现的使用技巧和注意事项,需要的朋友参考一下 贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不
本文向大家介绍Python贪心算法实例小结,包括了Python贪心算法实例小结的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python贪心算法。分享给大家供大家参考,具体如下: 1. 找零钱问题:假设只有 1 分、 2 分、五分、 1 角、二角、 五角、 1元的硬币。在超市结账 时,如果 需要找零钱, 收银员希望将最少的硬币数找给顾客。那么,给定 需要找的零钱数目,如何求得最少的硬币数
本文向大家介绍PHP实现的贪婪算法实例,包括了PHP实现的贪婪算法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现的贪婪算法。分享给大家供大家参考,具体如下: 背景介绍:贪婪算法与数据结构知识库算法可以说是离我们生活最近的一种算法,人总是贪婪的嘛,所以这种算法的设计是很符合人性的。之所以这么说,是因为人们会在生活中有意无意的使用贪婪算法来解决问题。最常见的就是找零钱了,每个人