贪心
贪心算法是一种不难也不难理解的算法
贪心算法,每一次决策时采取当前意义下最优策略的算法,依据局部最优性,贪心的正确性需要进行证明,不能把贪心和DP搞混。
所谓贪心就是说每次做出当前看起来 最好的选择,大多数这个时候是错的,但是有的时候,确实是对的
贪心,非常好实现,速度也很快
但是很难证明
1.微扰,贪心经常与排序在一起,微小的改变都会对整体改变
2.范围缩扩,在局部范围内不会改变结果
3.决策包容,什么意思,就是说其他可能的集合,也就是互相包容
贪心的代码因题而异。
这里为了方便理解,我把一道经典例题 合并果子 的代码拿过来,其实就是运用的优先级队列,每次取最大的两个
#include<iostream>
#include<queue>
using namespace std;
int n,s=0,t,a,b;
priority_queue <int,vector<int>,greater<int> > pq;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>t;
pq.push(t);
}
while(1)
{
if(pq.size()==1)
{
break;
}
a=pq.top();
pq.pop();
b=pq.top();
pq.pop();
s+=a+b;
pq.push(a+b);
}
cout<<s<<endl;
return 0;
}
本文介绍了贪心算法的基本概念,强调了其每次选择局部最优解的特点,并指出贪心算法的正确性需要证明。通过一个经典例题——合并果子,展示了如何使用优先级队列实现贪心策略,以求得最大合并价值。虽然贪心算法实现简单,速度快,但证明其全局最优性往往较为困难。
6871

被折叠的 条评论
为什么被折叠?



