贪心算法
Posted shirlybaby
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法相关的知识,希望对你有一定的参考价值。
贪心策略:总是考虑在当前状态下局部最优的策略,一定满足最优子结构,不断地把问题归纳为更小的相似地子问题
拟阵:许多用贪心算法求解的问题,可以表示求带权拟阵的最大权独立子集问题
区间贪心:
一、区间不相交问题
总是选择左端点最大的区间
struct node{ int x,y; }a[maxn]; bool cmp(node a,node b){ if(a.x!=b.x) return a.x>b.x; //先按照左端点从大到小排序 else return a.y<b.y; //不然就是右端点从小到大 } sort(a,a+n,cmp); int ans=1,lastx=a[0].x; for(int i=1;i<n;i++){ if(a[i].y<=lastx){ ans++; lastx=a[i].x; } }
二、区间选点问题
最少确定多少个点,才能使每个闭区间都至少存在一个点,和区间不相交问题一样,只需要改成a[i].y<lastx就可以了
最小生成树算法:常用的是prim和kruskal算法,都是采用了贪心的思想,但是策略不一样。
背包问题
一、部分背包问题:可以选择拿一件物品地部分东西,这个完全可以用贪心,选择当前单位价值最大的
二、01背包问题:因为要和选和不选的两种情况比较,所以产生的子问题互为重叠,需要用动态规划
以上是关于贪心算法的主要内容,如果未能解决你的问题,请参考以下文章