贪心法---活动安排问题

目录

贪心法的基本思想

贪心法的基本要素

1.最优子结构性质

2.贪心选择性质

贪心法的解题步骤及算法设计模式

活动安排问题

问题分析

贪心算法思路

代码实现


贪心法的基本思想

贪心法是一种稳扎稳打的算法,它从问题的某一个初始解出发,在每一个阶段都根据贪心策略来做出当前最优的决策,逐步逼近给定的目标,尽可能快的求得更好的解。当达到算法中的某一步不能再继续前进时,算法终止。

贪心法的基本要素

从许多可以用贪心法求解的问题中来看,它们一般都具有以下两个性质:

1.最优子结构性质

一个问题的最优解一定包含子问题的最优解,称此问题具有最优子结构性质;

2.贪心选择性质

贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择获得,即通过一系列的逐步局部最优选择使得最终的选择方案是全局最优的。

贪心选择性质所做的是一个非线性的子问题处理流程,即一个子问题并不依赖于另一个子问题,但是子问题间有严格的顺序性。

贪心法的解题步骤及算法设计模式

  1. 分解:将原问题分解为若干个相互独立的阶段
  2. 解决:对于每个阶段依据贪心策略进行贪心选择,求出局部的最优解
  3. 合并:将各个阶段的解合并为原问题的一个可行解。

接下来将通过一个经典问题来演示。

活动安排问题

问题分析

根据要求可以看出目前有三种贪心策略可以支持:

(1)每次从剩下的活动中选择开始时间最早的且不会与已安排的活动重叠的来安排,这样可以增大资源的利用率;

(2)每次从剩下的活动中选择活动时间最短的且不会与已安排的活动重叠的来安排,这样看似可以安排更多的会议;

(3)每次从剩下的活动中选择活动结束时间最早的的且不会与已安排的活动重叠的来安排,这样可以使下一个活动尽早开始。

第一个看似合理,但如果活动时间进行的太长,那么就只能进行一个活动;

第二个如果开始的时间太晚,到最后也只能进行一个活动;

所以最合理的方法就是第三个,这种策略可以给后面的活动留有更多的时间。

贪心算法思路

1.将所有的活动按照结束时间从小到大排序(保证第一个活动结束的时间最早);

2.让第二个开始的时间大于等于第一个结束的时间,以此类推(保证活动时间不会重叠,顺利进行);

3.从第一个活动开始往下考察,排除不符合的情况,选出满足条件的活动。

代码实现

#include <stdio.h>
#define a 20

void GreedySelect(int n,int b[],int f[],int choose[]);

int main()
{
	int n;
	int b[a];
	int f[a];
	int choose[a];
	
	printf("请输入活动的个数:");
	scanf("%d",&n);
	
	printf("请输入活动起始与结束的时间,按照结束时间升序排序:\n");
	for(int i = 1;i <= n;i ++)
	{
		scanf("%d%d",&b[i],&f[i]);
	}
	
	GreedySelect(n,b,f,choose);
	printf("被选择的活动有:");
	for(int i = 1;i <= n;i++)
	{
		if(choose[i] == 1)
			printf("%d", i );
			printf(" ");
	}
	return 0;
}

void GreedySelect(int n,int b[],int f[],int choose[])
{
	int j = 1;
	choose[1] = 1;
	for(int i = 2;i <= n;i++)
	{
		if(b[i] >= f[j])
		{
			choose[i] = 1;
			j = i;
		}else{
			choose[i] = 0;
		}
	}
}
	

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值