zoukankan      html  css  js  c++  java
  • 最优装载

    关键是证明可用贪心算法来求解,具体实现简单。

    题目描述

    有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。

    题目分析

    image_thumb2[1]

    image_thumb8[1]

    image_thumb5[1]

    采用重量最轻者先装的贪心选择策略,贪心算法可行性证明如下:

    首先证明该问题有一个最优解以贪心选择开始,进一步,在做了贪心选择,即选择了集装箱1后,原问题简化为一个更小的与原问题具有相同形式的子问题。对贪心选择次数用数学归纳法即知,贪心算法Loading最终产生原问题的最优解。

    PS:证明过程不是太好,可参考活动安排问题的证明。

    算法实现

    template<class Type>
    void Loading(int x[],  Type w[], Type c, int n)
    {        
        int *t = new int [n+1];        
        Sort(w, t, n);        
        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]];}
    }
    

    复杂性分析

    算法Loading的主要计算量在于将集装箱依其重量从小到大排序,故算法所需的计算时间为O(nlogn)。

  • 相关阅读:
    poj3718 Facer's Chocolate Dream
    codeforces 917D Stranger Trees
    uoj#349 【WC2018】即时战略
    bzoj5153 [Wc2018]州区划分
    bzoj5152 [Wc2018]通道
    loj2001[SDOI2017]树点染色
    loj2000[SDOI2017]数字表格
    Atcoder arc092
    bzoj4826[hnoi2017]影魔
    bzoj4827 [hnoi2017]礼物
  • 原文地址:https://www.cnblogs.com/xwz0528/p/4556518.html
Copyright © 2011-2022 走看看