贪心算法通过一系列的选择来得到问题的解,它所做的每个选择都是对当前状态下局部最好选择,即贪心选择。贪心算法求解问题的两个重要性质:贪心选择性质和最优子结构性质
活动安排
每个活动均有其开始时间与结束时间,两个活动相容,即[si,fi)与[sj,fj)交集为空.
求最大相容集合,即求活动数最多
解决办法 按照结束时间排序,降序排序
struct TActivity
{
int id;
float s,f;
bool b; //选中最优解的标志
TActivity():b(false){}
};
bool bGreader(const TActivity & x,const TActivity & y)
{ return x.f>y.f; }
int n =...;
TActivity *a = new TActivity[n];
std::sort(a,a+n,bGreader);
int last = 0;//最后选中的标号
a[0].b = true;
for(int i = 1;i<n;i++)
{
if(a[i].s>=a[last].f)
{
last = i;
a[i].b = true;
}
}
最优装载问题
问题描述:有一批集装箱要装上一艘载重量为c的轮船,若体积不受限,求最大装载方案(指的是最多箱子数)
方法:
- 按重量升序排序
- 依次装船(只要不超重)
template<class Type>
void Loading(int x[],Type w[],Type c,int n)
{
int *t =new int[n+1];
Sort(W,t,n);
for(int i = 1;i<=n;i++)
{
x[i] = 0;
}
for(int i = 1;i<=n&&w[t[i]]<=c;i++)
{
x[t[i]] = 1;
c-=w[t[i]];
}
}