贪心
概念
什么是贪心??
贪心算法(又称贪婪算法,GreedyAlgorithm)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
怎么用
贪心贪心,当然要贪一些,不谈怎么赢呢??(什么鬼=_=)根据题意,进行策划,每步都选取最优(tan)的方案,来得到问题的最优解。
局限性
贪心也并不是这么好用的。。。(那不然要DP等算法干嘛呢。。。)
为什么?
因为局部最优的总和并不一定是全局最优解!!!
所以在看题目时一定要用反证法等证明一下子。
与其他算法的不同
1.贪心与递推:与递推不同的是,贪心法中推进的每一步不是依据某一固定的递推式,而是当前看似最佳的贪心决策,不断的将问题归纳为更加小的相似的子问题。所以归纳、分析、选择正确合适的贪心策略,是正确解决贪心问题的关键。
2.贪心与动态规划:与动态规划不同的是,贪心是鼠目寸光;动态规划是统揽全局。
例题
叙述
在一个月黑风高的夜晚,蒟蒻萝卜偷偷摸摸鬼鬼祟祟地来到大神萝卜家里。。。
他要干什么???
只见他带来了一只U盘,插入大神萝卜的笔记本中!!!原来是来偷代码!!!
可蒟蒻萝卜只带了无数个最多只能装两个程序且内存为x的U盘(玄学U盘= =),大神萝卜的m个程序分别占用空间a1,a2,a3….am;
他想用尽可能少的U盘装下所有程序。。
怎么搞呀???
代码
不说废话
#include<bits/stdc++.h>
using namespace std;
int a[30010]={};
int main()
{
int n,s,ans=0;
cin>>s>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
int l=1,r=n;
while (l<=r)
{
if (a[l]+a[r]<=s) ans++,l++,r--;
else ans++,r--;
}
cout<<ans;
return 0;
}
解析
将大神代码长度进行排序,取最长的和最短的相加,并与x比较,若超出则最长的装在一个U盘中,将次长和最短之和与x比较,若不超,则两个放在一个盘中……
如此反复,可以得出最少使用U盘数ans!!