【蓝桥杯方法篇】贪心算法详解一

文章目录

  • 一,贪心算法
  • 二,以分配题为例
    • 2.1,饼干分配
    • 2.2,最少硬币问题
  • 三,区间问题

欢迎关注
蓝桥杯每日练习合集
共同努力。

一,贪心算法

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心——>局部最优——>全局最优
缺点:
有写情况并不适用。
缺点:
不从总体上考虑其它可能情况,每次选取局部最优解,不再进行回溯处理,所以很少情况下得到最优解。得到的解不代表是最优解。

二,以分配题为例

2.1,饼干分配

题目描述
有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小。每个孩子只能吃 最多一个饼干,且只有饼干的大小大于孩子的饥饿度时,这个孩子才能吃饱。求解最多有多少孩 子可以吃饱。
输入输出样例
输入两个数组,分别代表孩子的饥饿度和饼干的大小。输出最多有多少孩子可以吃饱的数 量。

Input: 
1,2
1,2,3
Output: 
2

思路分析:这道题可以使用贪心算法,我们可以将孩子饥饿度大小排序,再吧饼干大小排序,尽量把小饼干分出去。

看我的解题代码:

#include 
using namespace std;
//上进小菜猪
int main()
{
	int a=0,b[100],c=0;
	while(cin>>a)
    {
        b[c++]=a;
        if(cin.get()=='\n')break;
    }
    int a1=0,b1[100],c1=0;
    while(cin>>a1)
    {
        b[c1++]=a1;
        if(cin.get()=='\n')break;
    }
    sort(b,b+c);
    sort(b1,b1+c1);
    int cout1=0;
    for(int i=0,j=0;i<c;)
    {
        if(b[i]<=b1[j])
        {
            cout1++;
            j++;
            i++;
        }
        else
        {
            j++;
        }
    }
    cout<<cout1;
    return 0;
}

2.2,最少硬币问题

题目;
有1、2、5、10、20、50、100七种面值的硬币,要支付指定的金额,问怎么支付所用的硬币个数最少
输入:

157

输出:

4

思路:
可以使用贪心算法,以大数优先,这样就可以保持支付使用的硬币最少。
看我的解题代码;

#include
using namespace std;
int main()
{
    int x;
    cin>>x;
    int a[10]={1,2,5,10,20,50,100};
    int cout1=0;
    while(x)
    {
        for(int i=6;i>=0;i--)
        {
            if(x>=a[i])
            {
                cout1++;
                x-=a[i];
                break;

            }
        }
    }
    cout<<cout1;
}

三,区间问题

区间问题较为复杂,情况多变,今天时间有点晚,明天还需要仔细学习,后需更新【蓝桥杯方法篇】贪心算法详解二,主要攻克贪心算法的区间问题的相关思路。
区间问题详细细分:
1.区间选取
2.区间选点问题
3.区间完全覆盖问题
4.区间分组问题
5.给定区间,求覆盖的最大长度问题

你可能感兴趣的:(蓝桥杯准备每日练习,贪心算法,蓝桥杯,算法)