贪心

avarice

贪心

定义

  • 在对问题求解时,总是做出在当前看来是最好的选择。也就是说不从整体最优上考虑,而是在某种意义上求局部最优解,每次局部都是最优解则得到整体最优解

注意

  • 不是对所有问题都能得到最优解,关键是贪心策略的选择
  • 贪心算法的前提:局部最优解一定能导致全局最优解,且每次选择不会影响后续的选择

贪心的过程

  • 建立模型来描述问题;

  • 把求解的问题分成若干个子问题;

  • 对每一子问题求解,得到子问题的局部最优解;

  • 把子问题的解局部最优解合成原来解问题的一个解;

例题讲解

活动选择

原题链接

answer

贪心策略:优先选择结束时间最早的活动。这样可以为后续活动留出更多的时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;

// 创建结构体
struct Activity{
int Start_Time;
int Stop_Time;
};

// 结构体排序比较函数
bool compare(Activity a1,Activity a2){
return a1.Stop_Time<a2.Stop_Time;
}

int main(){
int n,ans=0;
cin >> n;
// 以vector容器存储活动时间
vector<Activity> activities(n);
for(int i =0;i<n;i++){
cin>>activities[i].Start_Time>> activities[i].Stop_Time;
}

// 对输入的时间根据结束时间进行排序
sort(activities.begin(),activities.end(),compare);

// 第一个必选
int LastSelect = activities[0].Stop_Time;
ans++;
// 遍历每一个结束时间最早,开始时间大于结束时间的活动,并计数
for(int i=1;i<n;i++){
if(LastSelect <= activities[i].Start_Time){
LastSelect = activities[i].Stop_Time;
ans++;
}
}

cout<<ans<<endl;

return 0;
}