贪心算法
使用贪心思想的一般方法:
1.其核心思想是利用题目性质,证明在某些情况下某种决策一定比另一种决策更优,或者一定不会被另一个决策更优,从而达到优化时间复杂度和简化问题的目的
2.猜测或推导出正确的结论
3.利用结论,设计决策方法
利用步骤2和步骤3是利用贪心思想的关键,其中证明结论的正确性尤其重要(困难)
一个典型的贪心问题:背包问题:
你有n种物品,背包可容纳重量m,每种物品重量分别为
g
[
i
]
g[i]
g[i],价值分别为
v
[
j
]
v[j]
v[j],每种物品你可以装任意重量,问怎么样才可以使背包内物品价值总和最大?
解:这样的问题解决就运用了贪心策略,即先求出每种物品的单位价值,将他们按照单位价值排序,由大到小依次装入背包,直到背包重量已满或者全部物品装入,此刻背包内价值最大。
反例:0-1背包问题
其基本条件与背包问题类似,只是对于某种物品,你只有两种选择:将其全部装下或者不装,并不能装一部分,在这种情况下,贪心未必能得到最优解
例:
物品数量:4 背包容量:10
重量:1 2 3 8
价值:2 3 7 20
如果贪心:最终会选取1、8两个物品价值22
而选择2、8两个物品。总价值23
贪心问题实例:洛谷P5019
贪心策略:
若a[i]>a[i-1],则计数器sum+=a[i]-a[i-1]
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int d[100001];
for(int i=0;i<n;i++)
{
cin>>d[i];
}
int sum=d[0];
for(int i=1;i<n;i++)
{
if(d[i]>d[i-1])sum=sum+d[i]-d[i-1];
}
cout<<sum;
return 0;
}