1做题目的:求最优解:最大,最小,最多,做少。。。。等最高级。
2最优解有约束的条件(区别于二分答案的答案就在区间之内的那种):背包只能装50公斤,区间调度两件事情之间不可以有叠加的情况。
3将最优解转化为局部最优解
刷过一些题目后不难得出,许多贪心算法的题目都涉及排序stl的使用,(这里从其原理上面来分析,因为他是想要找出“局部的一个最优解问题,而按照题意经过sort排序后的才有可能是最优解”)。——还有其他的要求,这里就要用到第二点里面总结的约束条件了。
板子:
步骤一:用stl函数将数组进行排序(通常这类题数据都是用数组存储的)’
步骤二:用for循环的方式去选取加上if语句(当前约束的条件)选取当前的最优解。(sum,cnt.....)同时约束条件有变化的可能,比如区间问题就要写个temp变量
for(......)
{....
if(....)
{ .... }
}
背包问题
#include<bitd/stdc++.h>
using namespace std;
struct node
{
int w,v;
double a;
};
struct node p[100];
bool cmp(node &m,node &n)//多定义为m,n
{
return m.a>n.a;
}
int main()
{
int n,c;//背包余下的容量
cin>>n>>c;
for(int i=0;i<n;i++)
{
cin>>p[i].w>>p[i].v;
p[i].a=p[i].v/p[i].w;//输入的同时计算平均数
}
sort(p,p+n,cmp);
double sum=0;
for(int i=0;i<n;i++)
{
if(c>p[i].w) //选择的方法。
{
sum+=p[i].v; //计算相关的最优解
//有的时候还涉及新的条件变化“直接用temp”表示
c-=p[i].w;
}
else
sum+=p[i].a*c;
}
cout<<sum;
return 0;
}