首页 > 代码库 > 贪心算法之最优装载

贪心算法之最优装载

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

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)

贪心算法之最优装载