贪心算法之最优装载

贪心算法通过一系列的选择来得到问题的解。它所做的每一个选择都是当前状态下局部最好选择。从许多的贪心算法求解的问题可以看到可用贪心算法求解的问题一般具有两个重要的性质:贪心选择性质和最优子结构性质。

1、贪心选择性质

贪心选择性质是 指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。与动态规划算法的不同之处是贪心算法只依赖在当前状态下做出最优选择,然后再去解做出这个选择后产生的相应的子问题。贪心算法依赖于以往做出的选择,但是绝不依赖未来做出的选择。所以贪心算法是自顶向下解决问题的。

2、最优子结构性质

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。一个问题是否具有最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。

下面是贪算法的最简单的一个实例,最优装载问题:

问题描述:

有一批集装箱要装上一艘载重量为c的货船。其中集装箱i的重量为n[i],问在不受体积限制的情况下,将尽可能多的集装箱装上船?

贪心算法之最优装载算法:
1、选择重量小的先装,所以首先需要排序。
2、不断装载,则是循环,要输出最优装载方案,则是需要进行记录装载
到的位置的。使用loading记录现在的装载量


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

void Load(int data[],int n,int c)       //最优装载函数

{

    int pos=0,i=0;

    int loading=0;

    InsertSort(data,n); //排序

    while(loading<c&&i<n) //如果总和还是小于c,i就有可能持续增大越界,这里需要加上条件限制

    {

        loading+=data[i];

        i++;

    }

    pos=--i;        //循环内部i在loading不满足小于c时还加了1,这里减掉

    cout<<"最优装载方案为:"<<endl;

    for(int j=0;j<=pos;j++)

        cout<<":"<<data[j]<<"-->"<<endl;

    cout<<"最多可以装载的集装箱数:"<<pos<<endl;

}

该问题的时间复杂度取决于排序函数的时间复杂度,这里采用的直接插入排序,所以时间复杂度为O(n^2)

时间: 2024-10-12 16:31:19

贪心算法之最优装载的相关文章

贪心算法:最优装载问题

/*----------------------------------------------------- 给出n个物体,第i个物体的重量为wi. 选择尽量多的物体,使得总重量不超过C. 输入: n和C以及n个整数表示的wi. 输出: 按照输入物体的顺序输出n个用空格分隔的Y或N. Y表示该物体被选中,N表示不被选中. 最后一行输出所选中的物体的个数num和总重量w,用空格分隔. 注意:这个地方每个物体是不可再分割的整体. 思路: 先把所有物体按重量排序(从小到大排序) , 然后贪心选择重量

贪心算法之最优装载问题

问题描述: 给出n个物体,第i个物体的重量是Wi,选择尽量多的物体,使得总重量不超过C. 问题分析: 这是一个很典型的用贪心算法的题目.要想让装的物体越多,自然装的最轻的物体就越多.因此可以对物体的重量由小到大进行排序,然后依次装载即可.这就体现了贪心算法只顾眼前,但却可以得到最优解. 解决问题:  代码如下 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> //为了引入memcpy 4 /

趣学算法2-1 最优装载问题

(1)数据结构定义          double w[N]; //一维数组存储古董的重量 (2)按重量排序          sort(w, w+n); //按古董重量升序排序 (3)按照贪心策略找最优解         首先用变量 count 记录已经装载的古董个数, tmp 代表装载到船上的古董的重量,两个变     量都初始化为 0.然后按照重量从小到大排序,依次检查每个古董, tmp 加上该古董的重量,     如果小于等于载重量 c,则令 count++:否则,退出.————————

最优装载(贪心)

描述:有一批集装箱要装上一艘载重量为C的轮船.其中集装箱i的重量为wi.最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船. 贪心算法之最优装载 给出n个物体,第i个物体的重量为wi. 选择尽量多的物体,使得总重量不超过C. 注意:这个地方每个物体是不可再分割的整体. 思路: 先把所有物体按重量排序(从小到大排序) , 然后贪心选择重量比较小的物体直到所选物体的总重量超过所允许的最大重量C .一般选择是从最小的开始,所以先要排序 第一种方法(容器) #include <i

贪心算法正确性证明(转载from刘子韬)

这里主要是介绍一种证明贪心算法是最优的一种方法:Exchange Argument (不知道应该怎么翻译到中文,交换参数?感觉听起来挺别扭的,不像是一个方法的名字~o(╯□╰)o) Exchange Argument的主要的思想也就是 先假设 存在一个最优的算法和我们的贪心算法最接近,然后通过交换两个算法里的一个步骤(或元素),得到一个新的最优的算法,同时这个算法比前一个最优算法更接近于我们的贪心算法,从而得到矛盾,原命题成立. 下面来看一个更为formal的解释: 步骤: Step0: 给出贪

从 活动选择问题 看动态规划和贪心算法的区别与联系

这篇文章主要用来记录我对<算法导论> 贪心算法一章中的“活动选择问题”的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题---粗略提下,详细请参考<算法导论> ②活动选择问题的DP(Dynamic programming)求解--DP求解问题的思路 ③活动选择问题的贪心算法求解 ④为什么这个问题可以用贪心算法求解? ⑤动态规划与贪心算法的一些区别与联系 ⑥活动选择问题的DP求解的JAVA语言实现以及时间复杂度分析 ⑦活动选择问题的Gr

算法复习笔记(分治法、动态规划、贪心算法)

分治法 动态规划 贪心算法 分治法 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的问题,这些子问题互相独立且与原问题相同(所以可以递归).递归地解这些子问题,然后将各个子问题的解合并得到原问题的解.它的一般算法设计模式如下: divide-and-conquer(P) { //|P|表示问题的规模,n0表示阈值,当规模不超过n0时,问题容易解出,不必分解 if(|P|<=n0) adhoc(P); //将P分解成子问题 divide P into smaller subinstanc

单源最短路径_贪心算法

问题描述 给定带权有向图G =(V,E),其中每条边的权是非负实数.另外,还给定V中的一个顶点,称为源.现在要计算从源到所有其它各顶点的最短路长度.这里路的长度是指路上各边权之和. 策略与数据结构 其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合.一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知. 相关解释 观测域:假设起点为v点,观测域便为v点的四周,即v的所有邻接点: 点集 V:图中所有点的集合: 点集 S:已经找到最短路径的终点集合: 数组 D:存储观测域内能观测到的最

贪心算法一:最优装载问题

1.基本思想: 贪心算法是通过一系列的选择来得到问题的解,它所做的选择都是当前情况下最优的选择,即贪心算法并不考虑整体最优,而考虑的是当前情况下的局部最优,即贪心选择. 2.贪心算法的两个性质: 1)贪心选择性质:所求解的问题的整体最优解可以通过一系列局部最优的选择来,即贪心选择达到.贪心选择所依赖的是以前所做过的选择,而对以后所做的选择没有关系. 2)最优子结构性质:一个问题的最优解包含其子问题的最优解. 3.贪心算法与动态规划的区别: 动态规划是通过自底向上的方式解决子问题,贪心算法是通过自