一、设计思想
把一个复杂的问题**分解**成一系列简单的**局部最优选择**,每一步都是对当前解的**扩展**,直到获得问题的解。
基本要素:(1)全局最优解可以由局部最优解得到;
(2)最优子结构:问题最优解包含其子问题的最优解;
二、与动态规划区别
动态规划的每一步都是建立在子问题的最优解上的,而贪心算法不依赖与子问题,这就是二者之间最大的区别。
三、习题
*1.部分背包问题*
给定n种物品和一背包。物品的体积是vi,其价值为pi,背包的容量为C。问应如何选择装入背包的商品,使得装入背包中物品的总价值最大?
输入:商品数量n,各商品的价值p,各商品的体积v,背包容量C
输出:所选商品价格的最大值
*****伪代码*** **
算法:
typedef struct node{
double p;
double v;
}package[100];
bool cmp(node x,node y){
return x.p/x.v>y.p/y.v;
}
sort(package,package+100,cmp);//快排
FractionKnapsack(n,p,v,C){
i<———1,total<——0
while C>0 and i<=n do // 背包还没有满且物体还有剩余时
if v[i] <= C then //当物体体积小于背包剩余容量时
total<——total+v[i]
C<——C-p[i]
else //当物体体积大于背包剩余容量时,直接把背包装满
total<——total+p[i]*(C/v[i])
C<——0
end if
i<——i+1
end while
return total
}