学习贪心算法

      初学贪心算法。字面不是太好理解,具体就是用这种方法处理某些问题时,能够在每一步找到最优解,并且最终形成全局最优解。

而具体的解题步骤大概可分为四步:

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如何进行比较,比较之后的情况不同,下一步执行的操作也不同。

以上内容仅个人观点,如果有更好的方法或者思路,欢迎一起讨论@_@

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值