核心思想:
在对问题求解时,总是做出再当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是某种意义上的局部最优解。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。
主要流程:
1.建立数学模型来描述问题
2.把求解的问题分成若干个子问题
3.对每一子问题求解,得到子问题的局部最优解
4.把子问题的解局部最优解合成原来解问题的一个解
选择条件:
用贪心算法只能通过解局部最优解的策略来达到全局最优解,因此一定要注意判断问题是否适合采用贪心算法策略,找到解是否一定是问题的最优解。
例题:
分析:这道题是一个典型的贪心算法。要求奶牛数量尽量少,因此需找出最高的奶牛,直至累计奶牛高度大于或等于书架高度
写法:先将奶牛高度降序排序,然后累加,直至高度大于或等于书架高度。
#include<bits/stdc++.h>
using namespace std;
int n,b,h[20005],res,x;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
cin>>n>>b;
for(int i=1;i<=n;i++)
{
cin>>h[i];
}
sort(h+1,h+n+1,cmp);
for(int i=1;i<=n;i++)
{
res++;
x+=h[i];
if(x>=b)
{
cout<<res;
break;
}
}
return 0;
}