zoukankan      html  css  js  c++  java
  • 算法分析与设计C++ 第五章:贪心算法

    贪心算法总是作出在当前看来最好的选择
    贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。

    思路

    1. 建立数学模型来描述问题
    2. 把求解的问题分成若干个子问题
    3. 对每个子问题求解,得到子问题的局部最优解
    4. 把子问题的解局部最优解合成原来问题的一个解

    贪心策略适用的前提是:

    • 局部最优策略能导致产生全局最优解。
      实际上,贪心算法适用的情况很少。一般对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可以做出判断

    贪心算法每一步必须满足一下条件:

    1、可行的:即它必须满足问题的约束。

    2、局部最优:他是当前步骤中所有可行选择中最佳的局部选择。

    3、不可取消:即选择一旦做出,在算法的后面步骤就不可改变了。

    贪心算法的实现框架

    从问题的某一初始解出发;
    
    while (能朝给定总目标前进一步)
    
    { 
    
          利用可行的决策,求出可行解的一个解元素;
    
    }
    
    由所有解元素组合成问题的一个可行解;
    

    例题

    最优装载问题

    有一批集装箱要装上一艘载重量为c的轮船,其中集装箱i的重量为wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船(件数最多)。
    采用重量最轻者先装的贪心选择策略

    template<class Type>
    void Loading(int x[],  Type w[], Type c, int n){
    int *t = new int [n+1];
    Sort(w, t, n);//t 存储的是按重量排好序的集装箱的序号
    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]];
    }
    }
    
  • 相关阅读:
    javascript设计模式——链式模式学习
    浏览器debug常用技巧
    前端到底要不要学后台
    坑爹的JS闭包,怎么去理解才是正确的
    如何更加简单的理解JS中的原型原型链概念
    前端那么多框架,我们到底学哪一个
    大前端之——数据交互
    随便写一点自己对前端的感受
    如何手动使用webpack搭建一个react项目
    浅谈 CSS 预处理器: 为什么要使用预处理器?
  • 原文地址:https://www.cnblogs.com/ZCWang/p/12507470.html
Copyright © 2011-2022 走看看