【算法导论】贪心算法之活动安排问题

简介:          对于许多最优化问题来说,采用动态规划来求解最优解有点大材小用了,只需要采用更简单有效的贪心算法就行了。贪心算法就是所做的每一步选择都是当前最佳的,通过局部最佳来寻求全局最佳解。

         对于许多最优化问题来说,采用动态规划来求解最优解有点大材小用了,只需要采用更简单有效的贪心算法就行了。贪心算法就是所做的每一步选择都是当前最佳的,通过局部最佳来寻求全局最佳解。就像砝码称重一样,总是优先选择大的砝码。

         贪心算法对大多数优化问题来说能产生最优解,但也不一定总是这样的。能用贪心算法解的典型问题包括活动选择问题、最小生成树、最短路径问题等等。下面我们来讨论活动活动选择问题:

          对于上面问题,贪心算法的思想就是:贪心选择使得剩下的、未调度的时间最大化。在本例中,先选择i=1,然后从xi>=x1的集合中选择fi最小的,此时i=4,然后从x>=x4的集合中选择fi最小的,此时i=8,然后从x>=x8的集合中选择fi最小的,此时i=11.因此就可以得到问题的一个最优解。

具体程序实现如下:

#include<stdio.h>
# define N 11

void GreadyActivitySelector(int *s,int *f,int *A,int n);
void RecursiveActivitySelector(int *s,int *f,int *A,int i,int n,int k);

void main()
{
	int s[N]={1,3,0,5,3,5,6,8,8,2,12};//开始时间
	int f[N]={4,5,6,7,8,9,10,11,12,13,14};//结束时间
	int A[N]={0};//初始化
	int n=N;
	GreadyActivitySelector(s,f,A,n);//迭代版本
//	RecursiveActivitySelector(s,f,A,0,n,0);//递归版本
	for(int i=0;i<n;i++)
		printf("%d ",A[i]);//被选择的活动 
}

/****************************************************\
函数功能:选择最佳的活动安排
输入:    各个活动的起始时间和结束时间、待存储被选择活动的数组A、活动个数
输出:    无
\****************************************************/

void GreadyActivitySelector(int *s,int *f,int *A,int n)//迭代版本
{
	A[0]=1;
	int	i=0;
	int j=1;
	for(int m=1;m<n;m++)
	{
		if(s[m]>=f[i])//开始时间大于上个活动的结束时间
		{
			i=m;
			A[j]=m+1;//注意下标与第几位差一
			j++;
		}
	}
}

/****************************************************\
函数功能:选择最佳的活动安排
输入:    各个活动的起始时间和结束时间、待存储被选择活动的数组A、i,n表示子问题的活动,活动个数
输出:    无
\****************************************************/
void RecursiveActivitySelector(int *s,int *f,int *A,int i,int n,int k)//递归版本
{
	int j=k;
	int m=i;

	while((m<n)&&(s[m]<f[i])&&(m!=0))//找到结束时间大于上个活动开始时间的活动
		m=m+1;
	if(m<n)
	{
		A[j]=m+1;//将被选择的活动存储起来
		
		j++;
		RecursiveActivitySelector(s,f,A,m+1,n,j);
	}


}


原文:http://blog.csdn.net/tengweitw/article/details/16993653

作者:nineheadedbird

目录
相关文章
|
27天前
|
算法 Java C++
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
|
5月前
|
算法 C++ Python
数据结构与算法===贪心算法
数据结构与算法===贪心算法
|
2月前
|
算法 前端开发
一文了解贪心算法和回溯算法在前端中的应用
该文章深入讲解了贪心算法与回溯算法的原理及其在前端开发中的具体应用,并通过分析LeetCode题目来展示这两种算法的解题思路与实现方法。
|
3月前
|
算法
【算法】贪心算法——柠檬水找零
【算法】贪心算法——柠檬水找零
|
3月前
|
算法
【算法】贪心算法简介
【算法】贪心算法简介
|
4月前
|
算法 Python
Python算法高手进阶指南:分治法、贪心算法、动态规划,掌握它们,算法难题迎刃而解!
【7月更文挑战第10天】探索Python算法的精华:分治法(如归并排序)、贪心策略(如找零钱问题)和动态规划(解复杂问题)。通过示例代码揭示它们如何优化问题解决,提升编程技能。掌握这些策略,攀登技术巅峰。
102 2
|
4月前
|
存储 算法 Python
Python算法界的秘密武器:分治法巧解难题,贪心算法快速决策,动态规划优化未来!
【7月更文挑战第9天】Python中的分治、贪心和动态规划是三大关键算法。分治法将大问题分解为小问题求解,如归并排序;贪心算法每步选局部最优解,不保证全局最优,如找零钱;动态规划存储子问题解求全局最优,如斐波那契数列。选择合适算法能提升编程效率。
64 1
|
4月前
|
存储 算法 大数据
Python算法高手的必修课:深入理解分治法、贪心算法、动态规划,让你的代码更智能!
【7月更文挑战第9天】在Python算法学习中,分治法(如归并排序)将大问题分解为小部分递归解决;贪心算法(如货币找零)在每步选择局部最优解尝试达到全局最优;动态规划(如斐波那契数列)通过存储子问题解避免重复计算,解决重叠子问题。掌握这三种方法能提升代码效率,解决复杂问题。
45 1
|
4月前
|
算法 索引 Python
逆袭算法界!Python分治法、贪心算法、动态规划深度剖析,带你走出算法迷宫!
【7月更文挑战第8天】分治法,如快速排序,将大问题分解并合并解;贪心算法,选择局部最优解,如活动选择;动态规划,利用最优子结构避免重复计算,如斐波那契数列。Python示例展示这些算法如何解决实际问题,助你精通算法,勇闯迷宫。
44 1
|
4月前
|
算法 索引 Python
Python算法设计与分析大揭秘:分治法、贪心算法、动态规划...掌握它们,让你的编程之路更加顺畅!
【7月更文挑战第8天】探索Python中的三大算法:分治(如快速排序)、贪心(活动选择)和动态规划(0-1背包问题)。分治法将问题分解求解再合并;贪心策略逐步求局部最优;动态规划通过记忆子问题解避免重复计算。掌握这些算法,提升编程效率与解决问题能力。
39 1