🧸安清h:个人主页
🎥个人专栏:【计算机网络】
🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。
文章目录
🎯贪心法的基本思想
贪心法是一种稳扎稳打的算法,它从问题的某一个初始解出发,在每一个阶段都根据贪心策略来做出当前最优的决策,逐步逼近给定的目标,尽可能快的求得更好的解。当达到算法中的某一步不能再继续前进时,算法终止。
🎯贪心法的基本要素
从许多可以用贪心法求解的问题中来看,它们一般都具有以下两个性质:
🚦最优子结构性质
一个问题的最优解一定包含子问题的最优解,称此问题具有最优子结构性质;
🚦贪心选择性质
贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择获得,即通过一系列的逐步局部最优选择使得最终的选择方案是全局最优的。
贪心选择性质所做的是一个非线性的子问题处理流程,即一个子问题并不依赖于另一个子问题,但是子问题间有严格的顺序性。
🎯贪心法的解题步骤及算法设计模式
- 分解:将原问题分解为若干个相互独立的阶段
- 解决:对于每个阶段依据贪心策略进行贪心选择,求出局部的最优解
- 合并:将各个阶段的解合并为原问题的一个可行解。
接下来将通过一个经典问题来演示。
🎯活动安排问题
🚦问题分析
根据要求可以看出目前有三种贪心策略可以支持:
(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;
}
}
}
非常感谢您的阅读,如果这篇文章对您有帮助,那将是我的荣幸。我们下期再见啦🧸!