描述:有一批集装箱要装上一艘载重量为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 }

 

无往而不至