贪心算法

来源:互联网 发布:php网站开发 编辑:程序博客网 时间:2024/06/17 12:24

贪心算法

概念

所谓贪心算法是指,在对问题求解时,总是做出在==当前==看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
==贪心算法没有固定的算法框架==,算法设计的==关键是贪心策略的选择==必须注意的是,贪心算法不是对所有问题都能得到整体最优解,==选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。==
所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。

算法思想

1.建立数学模型来描述问题。2.把求解的问题分成若干个子问题。3.对每一子问题求解,得到子问题的局部最优解。4.把子问题的解局部最优解合成原来解问题的一个解。

可用范围

贪心策略适用的前提是:局部最优策略能导致产生全局最优解。
实际上,==贪心算法适用的情况很少==。 一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。

算法框架

从问题的某一初始解出发;while (能朝给定总目标前进一步){       利用可行的决策,求出可行解的一个解元素;}由所有解元素组合成问题的一个可行解;

Silver叨逼叨

刷题的大多数情况下都是用动态规划的,最为经典是背包问题。然背包问题单独分成一个模块来进行分析。往下列举一个较为简单的例子

举个栗子

假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?用贪心算法的思想,很显然,每一步尽可能用面值大的纸币即可。在日常生活中我们自然而然也是这么做的。在程序中已经事先将Value按照从小到大的顺序排好。

#include<iostream>  #include<algorithm>  using namespace std;  const int N=7;   int Count[N]={3,0,2,1,0,3,5};  int Value[N]={1,2,5,10,20,50,100};  int solve(int money)   {      int num=0;      for(int i=N-1;i>=0;i--)       {          int c=min(money/Value[i],Count[i]);          money=money-c*Value[i];          num+=c;      }      if(money>0) num=-1;      return num;  }  int main()   {      int money;      cin>>money;      int res=solve(money);      if(res!=-1) cout<<res<<endl;      else cout<<"NO"<<endl;  }  

很简单也很直接的阐述了贪心算法的核心思想。