贪心策略
贪心选择性质:一个全局最优解可通过做局部最优(贪心)选择来达到。
最优子结构:如果问题的一个最优解包含了其子问题的最优解。
贪心算法与动态规划算法的差异:贪心算法和动态规划算法都要求问题具有最优子结构性质,这是两类算法的一个共同点。但是,对于一个具有最优子结构的问题应该选用贪心算法还是动态规划算法来求解?是不是能用动态规划算法求解的问题也能用贪心算法来求解?下面我们来研究两个经典的组合优化问题,并以此来说明贪心算法与动态规划算法的主要差别。
一、部分背包问题
假定有n个商品,每个商品i的重量为w[i],价值为v[i],现有一个背包,最多能装M的重量。其中(0 <= i < N, 0 < w[i] < M)。
问题:怎样装能使包中装入的商品价值最高(对于每个商品i可以只装该商品的一部分x[i])?
即对w[1]*x[1] + w[2]*x[2] + ... + w[n]*x[n] <= M
当0 <= x[i] <= 1, v[i] > 0, 1 <= i <= n时
使得v[1]*x[1] + v[2]*x[2] + ... + v[n]*x[n]取得最大。
KnapsackMain.c
贪心选择性质:一个全局最优解可通过做局部最优(贪心)选择来达到。
最优子结构:如果问题的一个最优解包含了其子问题的最优解。
贪心算法与动态规划算法的差异:贪心算法和动态规划算法都要求问题具有最优子结构性质,这是两类算法的一个共同点。但是,对于一个具有最优子结构的问题应该选用贪心算法还是动态规划算法来求解?是不是能用动态规划算法求解的问题也能用贪心算法来求解?下面我们来研究两个经典的组合优化问题,并以此来说明贪心算法与动态规划算法的主要差别。
一、部分背包问题
假定有n个商品,每个商品i的重量为w[i],价值为v[i],现有一个背包,最多能装M的重量。其中(0 <= i < N, 0 < w[i] < M)。
问题:怎样装能使包中装入的商品价值最高(对于每个商品i可以只装该商品的一部分x[i])?
即对w[1]*x[1] + w[2]*x[2] + ... + w[n]*x[n] <= M
当0 <= x[i] <= 1, v[i] > 0, 1 <= i <= n时
使得v[1]*x[1] + v[2]*x[2] + ... + v[n]*x[n]取得最大。
KnapsackMain.c
/**/
/*
* Copyright@2008,cn.edu.seu.cose
* All rights reserverd.
*
* Author:Greentea
* Date:08.02.11
*/
#include < stdio.h >
#include < stdlib.h >
typedef struct ElemType ... {
int *index; /**//*物品编号*/
int length; /**//*物品数*/
float *w; /**//*物品重量*/
float *v; /**//*物品价值*/
float *r; /**//*物品的单位价值*/
float *x; /**//*物品所取量[0, 1]*/
} Elem;
Elem * InitElem( int * index, float * w, float * v, float * r, float * x, int n)
... {
int i;
Elem *
* Copyright@2008,cn.edu.seu.cose
* All rights reserverd.
*
* Author:Greentea
* Date:08.02.11
*/
#include < stdio.h >
#include < stdlib.h >
typedef struct ElemType ... {
int *index; /**//*物品编号*/
int length; /**//*物品数*/
float *w; /**//*物品重量*/
float *v; /**//*物品价值*/
float *r; /**//*物品的单位价值*/
float *x; /**//*物品所取量[0, 1]*/
} Elem;
Elem * InitElem( int * index, float * w, float * v, float * r, float * x, int n)
... {
int i;
Elem *