• 最优装载(贪心)


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

    贪心算法之最优装载

    给出n个物体,第i个物体的重量为wi。
    选择尽量多的物体,使得总重量不超过C。
    注意:这个地方每个物体是不可再分割的整体。
    思路:
    先把所有物体按重量排序(从小到大排序) , 
    然后贪心选择重量比较小的物体直到所选物体的总重量超过所允许的最大重量C 。
    一般选择是从最小的开始,所以先要排序

    第一种方法(容器)

    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    int main()
    {
        int c;  //轮船的载重量
        cout<<"轮船的载重量: ";
        cin>>c;
        int n;  //集装箱个数
        cout<<"集装箱个数: ";
        cin>>n;
        vector <int> v(n);//定义一个容器v(n),其类型为int·
        cout<<"物品质量:";
        for(int i=0;i<n;i++)
           cin>>v[i];
        sort(v.begin(),v.end());//从小到大排序
        int all=0;  //最多能装的集装箱个数
        int cp=c;    //当前剩余载重量
        for(int i=0;i<n;i++)
        {
            if(cp<=c&&v[i]<=cp)
            {
                all++;
                cp-=v[i];
            }
            if(cp<v[i])  break;
        }
        cout<<"最多可装入的个数:"<<all<<endl;
        cout<<"最终承载量:"<<c-cp<<endl;
        return 0;
    }

    第二种方法

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 
     6 int main()
     7 {
     8     int i,j,c,n;//分别为测试个数、集装箱个数
     9     float weight[1000];//集装箱重量
    10     float load;//轮船载重量
    11     cin>>c;  
    12     for(i=0;i<c;i++)
    13     {
    14           cin>>n>>load;
    15                for(j=0;j<n;j++)
    16           cin>>weight[j];
    17           sort(weight,n+weight);
    18           //开始装载
    19           int count=0;
    20           float sum=0.0;
    21           for(int k=0;k<n;k++)
    22           {
    23               if(load>=weight[k])
    24               {
    25                  sum=sum+weight[k];
    26                  load=load-weight[k];
    27                  count++;
    28               }
    29               else
    30               break;
    31   
    32           }
    33           cout<<count<<" "<<sum<<endl;
    34         }
    35 
    36
    39     return 0;
    40 
    41 
    42 }
  • 相关阅读:
    【转】微信小程序原理
    【转】onAttachedToWindow()在整个Activity生命周期的位置及使用
    中序遍历非递归遍历算法
    多项式加法运算
    中缀表达式转换为后缀表达式
    多项式计算
    最大子列和问题
    广度优先搜索
    广搜和深搜的区别
    cookie 与 session 的区别详解
  • 原文地址:https://www.cnblogs.com/creative-work/p/9192608.html
Copyright © 2020-2023  润新知