贪心算法:
(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;
}