今天我们来说说贪心算法,那什么是贪心算法呢?来看下定义 。
1.什么是贪心算法:
贪心算法(又称贪婪算法,Greedy Algorithm)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
2.基本思路
(1)把求解的问题分成若干个子问题。
(2)对每一子问题求解,得到子问题的局部最优解。
(3)把子问题的解局部最优解合成原来解问题的一个解。
3、算法实现
(1)从问题的某个初始解出发。
(2)采用循环语句,当可以向求解目标前进一步时,就根据局部最优策
略,得到一个部分解,缩小问题的范围或规模。
(3)将所有部分解综合起来,得到问题的最终解。
4、贪心方法的基本思想
*贪心是一种解题策略,也是一种解题思想。
*使用贪心方法需要注意局部最优与全局最优的关系,选择当前状态的局部最优并不一定能推导出问题的全局最优
*利用贪心策略解题,需要解决两个问题:
—**该题是否适合于用贪心策略求解**
—**如何选择贪心标准,以得到问题的最优解**
5、贪心法的特点
1.贪心选择性质:算法中每一步选择都是当前看似最佳的选择,这种选择依赖于已做出的选择,但不依赖于未做的选择。
2.最优子结构性质:算法中每一次都取得了最优解(即局部最优解),要保证最后的结果最优,则必须满足全局最优解包含局部最优解。
3.但并不是所有具有最优子结构的问题都可以用贪心策略求解。因为贪心往往是盲目的,需要使用更理性的方法——动态规划(例如“0-1背包问题”与“部分背包问题”)
***
【问题1】部分背包问题
给定一个最大载重量为M的卡车和N种食品,有食盐,白糖,大米等(假设它们都是散装且大货车只受重量限制不受体积限制)。已知第i种食品的最多拥有Wi公斤,其商品价值为Vi元/公斤,编程确定一个装货方案,使得装入卡车中的所有物品总价值最大。
**分析**:因为每一个物品都可以分割成单位块,单位块的利益越大,显然总收益越大,所以它局部最优满足全局最优,可以用贪心法解答。
**方法如下**:先将单位块收益按从大到小进行排列,然后用循环从单位块收益最大的取起,直到不能取为止便得到了最优解。
***代码如下***
#include<cstdio>
#include <iostream>
#include<cstring>
#include<algorithm>
#include<string>
#define OBJECT_NUM 3 //物品的个数
#define KNAP_WEIGHT 50 //背包的重量
using namespace std;
struct input_object
{
int w;
int v;
double r;
};
/*
调用sort排序函数,按照价值与重量比排序,如果贪心
比值相等则按照重量排序
*/
bool bigger(input_object a,input_object b)
{
if(a.r==b.r)return a.w<b.w;
else return a.r>b.r;
}
int main(void)
{
input_object *object;
int curr_w=0;//当前背包的总重量
double value=0;//背包当前的总价值
//分配空间