贪心算法
来源:互联网 发布: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; }
很简单也很直接的阐述了贪心算法的核心思想。
阅读全文
0 0