贪心算法&例题讲解

贪心算法:

(1)概念:

贪心算法即逐步获得最优解,是解决最优化问题时的一种方法。算法设计的关键是贪婪策略的选择。
贪心算法是对某些求解最优解问题的最简单、最迅速的方法。某些问题的最优解可以通过一系列的最优的选择即贪心选择来达到。但局部最优并不总能获得整体最优解,但通常能获得近似最优解。
在每一步贪心选择中,只考虑当前对自己最有利的选择,而不去考虑在后面看来这种选择是否合理。

(2)基本步骤:

1.从问题的某个初始解出发
2.采用循环语句,当可以向求解目标前进一步时,就根据局部最优策略,得到一个不分解,缩小问题的范围或规模。
3.将所有的部分解综合起来,得到问题的最终解。

(3)实际应用:

由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要。帮助 Marry 乳业找到最优的牛奶采购方案。

Marry 乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格可能相同。此外,就像每头奶牛每天只能挤出固定数量的奶,每位奶农每天能提供的牛奶数量是一定的。每天 Marry 乳业可以从奶农手中采购到小于或者等于奶农最大产量的整数数量的牛奶。

给出 Marry 乳业每天对牛奶的需求量,还有每位奶农提供的牛奶单价和产量。计算采购足够数量的牛奶所需的最小花费。

注:每天所有奶农的总产量大于 Marry 乳业的需求量。
输入格式:
1)第一行二个整数 n,m,表示需要牛奶的总量,和提供牛奶的农民个数。
2)接下来 m 行,每行两个整数 pi,ai,表示第i个农民牛奶的单价,和农民i一天最多能卖出的牛奶量。
输出格式
单独的一行包含单独的一个整数,表示 Marry 的牛奶制造公司拿到所需的牛奶所要的最小费用。

输入                        输出
100 5                       630
5 20
9 40
3 10
8 80
6 30

分析:每次找卖牛奶最便宜的农民购买,直到满足需求
操作:可以先建立一个全为0数组,i看作是牛奶的单价。从单价小到单价大赋值,这样在购买时可以通过循环数组的到需要牛奶的数量,每一次购买的时候都是找最便宜的购买。
详细步骤
从单价最低到单价最高的开始给数组赋值,a表示单价为p的牛奶的总量,注意不能直接v[p]=a因为可能会出现不同农民售卖的牛奶单价是相同的情况,遇到多个农民售卖单价相同的牛奶时直接累加就行。

for(int i=1;i<=m;i++)
    {
         cin>>p>>a;
         v[p]+=a;
    }

购买的数量小于n时,开始从单价低到高循环,最后计算出结果即可

for(int p=0;p<=1001;p++)
    {
        if(v[p]&&n)
        {
            if(n>=v[p])
            {
                n-=v[p];
                num+=v[p]*p;
            }
            else
            {
                num+=n*p;
                n=0;
            }
        }
    }

代码如下

#include <iostream>
using namespace std;
int main()
{
    int n;//牛奶需求量
    int m;//提供农民个数
    int p;//牛奶单价
    int a;//牛奶总量
    long int v[1001]={0};
    int num=0;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
         cin>>p>>a;
         v[p]+=a;
    }
    for(int p=0;p<=1001;p++)
    {
        if(v[p]&&n)
        {
            if(n>=v[p])
            {
                n-=v[p];
                num+=v[p]*p;
            }
            else
            {
                num+=n*p;
                n=0;
            }
        }
    }
    cout<<num;
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快请我吃麦当当

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值