初学贪心算法。字面不是太好理解,具体就是用这种方法处理某些问题时,能够在每一步找到最优解,并且最终形成全局最优解。
而具体的解题步骤大概可分为四步:
1、将问题分解开,分成几个容易解决的小问题
2、找出适合的贪心策略,也就是如何实施贪心
3、求解每一个字问题或者每一步的局部最优解
4、将局部最优解进行合并,形成全局最优解
我认为学习贪心算法的入门题应该就是分糖果或者分饼干的题。大概意思就是有几只小孩,有一些饼干或者糖果。每个小孩都有一个饥饿度,每个糖果或者饼干都有一个饱腹度(大概就那个意思),在饼干或者糖果有限的情况下,使尽可能多的小孩能饱腹。问题开始,应该思考,既然要使尽可能多的小孩饱腹,那么就应该把每个小孩的饥饿度和每个饼干或者糖果的饱腹度排序,而分解的若干个问题即为哪个糖果刚好能够满足第一个小孩,以此类推,每一次都会选出一个大于或等于小孩饥饿度最小的糖果,最后就会形成全局最优解。
关于本题,我个人的思路是:可以利用c++的STL来解决,比如vector。先建立两个vector分别用来存放小孩饥饿度和饼干饱腹度。接下来使用c++内置函数sort()来对其排序。定义迭代器,分别指向两个动态数组的开头,逐一进行比较,如果第一位的糖果能够满足第一位的小孩,则二者共同向后移动一位,否则糖果移动而小孩不移动,直到该小孩有符合的饼干,小孩移动到下一个。
糖果:5 7 10 14 16
小孩:3 6 7 10 13
结果:5 全都满足
糖果:5 7 8 14 16
小孩:3 7 9 10 13
结果:4
糖果:5 7 8 9 16
小孩:6 7 10 12 13
结果:3
相关代码(其他数据不一定适用,未经过大量数据测试):
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int m,n; //m个糖果,n个孩子
cin>>m>>n;
vector<int> m1; //用来存放糖果的饱腹度
vector<int> n1; //用来存放小孩需要的饱腹度
for(int i=0; i<m; i++)
{
int x; //循环输入糖果的度
cin>>x;
m1.push_back(x);
}
for(int i=0; i<n; i++)
{
int y; //循环输入小孩需要的度
cin>>y;
n1.push_back(y);
}
sort(m1.begin(),m1.end());
sort(n1.begin(),n1.end());
int number=0;
for(int i=0; i<m1.size(); i++) //遍历糖果饱腹度
{
if(number<n1.size() && n1[number]<=m1[i]) //判断小孩饥饿度是否小于饱腹度
number++;
}
cout<<number<<endl; //输出能满足的小孩数
return 0;
}
我的思路就是把饼干先便利,对每个小孩进行测试是否满足饥饿度。难理解的关键点在于这两个抽象的vector如何进行比较,比较之后的情况不同,下一步执行的操作也不同。
以上内容仅个人观点,如果有更好的方法或者思路,欢迎一起讨论@_@