C++贪心算法实现活动安排问题(实例代码)

 更新时间:2019年11月04日 11:44:23   作者:Weisswire  
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。这篇文章主要介绍了C++贪心算法实现活动安排问题,需要的朋友可以参考下

贪心算法

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。

贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

具体代码如下所示:

#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语言详细讲解qsort函数的使用

    C语言详细讲解qsort函数的使用

    排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等。看名字都知道快速排序是目前公认的一种比较好的排序算法。因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。这就是qsort函数
    2022-04-04
  • C++ 中回文数判断简单实例

    C++ 中回文数判断简单实例

    这篇文章主要介绍了C++ 中回文数判断简单实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • C++中COM组件初始化方法实例分析

    C++中COM组件初始化方法实例分析

    这篇文章主要介绍了C++中COM组件初始化方法,涉及C++中COM组件的使用技巧,需要的朋友可以参考下
    2015-05-05
  • C++实现俄罗斯方块(linux版本)

    C++实现俄罗斯方块(linux版本)

    这篇文章主要为大家详细介绍了linux版本C++实现俄罗斯方块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Qt实现简易计时器的示例代码

    Qt实现简易计时器的示例代码

    计时器实现四个功能:开始计时、停止计时、暂停计时以及打点。当点击暂停时,开始按钮和停止按钮无法点击。当点击停止时,开始按钮和暂停按钮无法点击,此时停止按钮变为清零。本文将用Qt实现这样的一个计时器,需要的可以参考一下
    2022-06-06
  • 举例理解C语言二维数组的指针指向问题

    举例理解C语言二维数组的指针指向问题

    这篇文章主要介绍了C语言二维数组的指针指向问题,文中不建议用二级指针来访问二维数组,需要的朋友可以参考下
    2015-12-12
  • C/C++ 中的预处理器指令及用法详解

    C/C++ 中的预处理器指令及用法详解

    本文介绍了C/C++预处理器指令的用途和示例,包括包含头文件、定义宏、条件编译、取消宏定义和#pragma指令等,结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • 贪吃蛇C语言代码实现(难度可选)

    贪吃蛇C语言代码实现(难度可选)

    这篇文章主要为大家详细介绍了贪吃蛇C语言代码实现,游戏难度可供选择,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • linux内核select/poll,epoll实现与区别

    linux内核select/poll,epoll实现与区别

    这篇文章主要介绍了linux内核select/poll,epoll实现与区别,需要的朋友可以参考下
    2016-11-11
  • MATLAB实现五子棋游戏(双人对战、可悔棋)

    MATLAB实现五子棋游戏(双人对战、可悔棋)

    这篇文章主要为大家详细介绍了MATLAB实现五子棋游戏,可以进行双人对战、也可悔棋,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06

最新评论