贪心算法
贪心算法:
在贪心算法中,我们要逐步构造一个最优解。每一步,我们都在一定的标准下,做出一个最优决策。做出决策所依据的标准称为贪心准则。
即贪心思想指的是寻找局部最优解,然后通过推导局部最优解能够最后导出整体最优解。
局部最优解:
即不从整体最优上加以考虑而设计算法,做出的仅是在某种意义上的局部最优解。
特点:
1、可行性:即它必须满足问题的约束。
2、局部最优:他是当前步骤中所有可行选择中最优的局部选择。
3、无后效性:即未来与过去无关,只和现在有关。
证明:
在设计代码求最优解时需要证明所求为最优解且通过局部最优解求出的结果即为本题的最优解,一般证明可用反证法,数学归纳法。
贪心算法案例:
最优装载问题:
给出n批货物的重量 以及车能够负载的最大重量m,求车能够负载的最多货物的批数。
本题是一道经典的贪心问题,方法为现将n批货物排序,然后将轻的到重的依次放到车上,直到达到车负载的临界。
如果轻的货物放不上去,重的肯定也放不上去,而如果把轻的换成重的,则总批数不变,故方法正确。
具体代码实现如下:
#include<bits/stdc++.h>
using namespace std;
main()
{
int n,m;
int a[150];
int sum = 0,all = 0; //sum为计数器,all储存当前货物重量
cin>>n>>m;
for(int i = 0;i < n;i++)
cin>>a[i];
sort(a,a+n);
for(int i = 0;i < n;i++)
{
if(all + a[i] <= m)
{
sum++;
all+=a[i];
}
else break;
}
cout<<sum;
}