贪婪算法货车装货问题

    一批有顺序的包裹Pi,重量分别为Wi,每次只能给一个货车装车,货车的载重上限均为m,装包裹必须按顺序。例如:一号车装了一号包裹,如果不装二号包裹就不能装三号包裹,只能离开。

   若m已给出,除了每辆货车都装包裹直到装不下下一个包裹为止这个方案,有没有更好的贪心算法。

这个题是要求啥? 是要求用的车最少?

和这个类似:https://blog.csdn.net/qzq2514/article/details/54984297

这道题其实没什么好想的,它都要求要按顺序装车了,那你只能装到每辆车装不下为止,就换下一辆。
除非它没有要求按顺序装车,就能用动态规划法了。

//v[N]包裹重量
int sum = 0, c = m;
//sum需要货车数量,c当前货车可装重量
for(int i = 0; i < n; i ++){
    if(c < v[i]) {//换车
        c = m;
        sum ++;
    }
    c -= v[i];
}
cout << sum << endl;
建议常规算法外,可结合车辆车厢合法装载尺寸、额定载重、货物尺寸、货物重量等信息进行测算

1. 车辆基础信息表
VehPlate        --车辆号牌
VehPlateColor   --车辆号牌颜色
Vol_Length      --车厢有效装载 长度(mm)
Vol_Width       --车厢有效装载 宽度(mm)
Vol_Height      --车厢有效装载 高度(mm)
Veh_CurbWeight  --车辆整备质量(kg)
Veh_RatedLoadingWeight --车辆核定载重(kg)
Veh_GrossWeight --总重量(kg)
Veh_OverallDimension   --车辆外廓尺寸(长×宽×高mm)
Veh_Model       --车辆品牌型号
Comment         --备注
【...及其他内容】

2. 货物信息表
goodsNo         --货物No
goods_Length    --长度(mm)
goods_Width     --宽度(mm)
goods_Height    --高度(mm)
goods_Weight    --重量(kg)
Des_AreaID      --目的地 地区ID
Des_RegionName  --目的地 市级
Des_CountryName --目的地 县/镇/区
【...其他快递公司、运单号等信息】

3. 货物装车逻辑
(1)测算货物(包裹)总体容积需求
A.占用空间
B.总重量

(2)评估车辆需求
依容积、运费、油耗、线路等评估车辆优先规则,测算备用车辆(是以大车优先还是别的...)

(3)装载流程
定义变量
float 容积空间计数;
float 重量计数;
int 货物计数;
int 货物总数;

货物总数=货物信息表将要载运的数量;

货物计数=0;
while (货物计数 <= 货物总数)
{
   备选车辆目录中选择一辆车
   重量计数=0;
   容积空间计数=0;
   while
   (
      (容积空间计数 < 当前车辆车厢有效装载尺寸空间)
      ||  (重量计数 < 当前车辆核定载重Veh_RatedLoadingWeight)
   )
   &&  (货物计数 <= 货物总数)
   {
      取一个货物装车 【从货物信息表】
      货物计数 = 货物计数 + 1;

      容积空间计数 += 货物尺寸(长×宽×高);
      重量计数 += 货物重量goods_Weight;
   }
}

这是同类型的题,核心是这个关键代码

进行贪心选择,寻找最优解;
使用变量ans记录已经装载的货物个数,tmp代表已经装载到车上的货物体积初始化都为0;`
int ans = 0,tmp = 0;
for(int i = 0; i < n; i++){
    tmp += v[i];
    if(tmp <= V){
        ans++;
    }else break;
}

参考代码

//贪心算法计算船只最多装入多少货物 

#include<iostream>
#include<algorithm>

using namespace std; 
const int N = 1000000;
double v[N];//货物的体积数组

int main()
{
    int ans = 0;// 已经装入船只的货物数量
    int tmp = 0;//装入船只货物的总体积
    int V; //货车最多容纳的货物总体积
    int n;//货物的数量
    
    cout<<"输入货车体积及货物个数:"<<endl;
    cin>>V>>n;
    cout<<"输入货物的体积:"<<endl;
    for(int i = 0; i < n; i++){
        cin>>v[i];
    }
    //需要得到更多的货物,贪心策略即每次装入最轻的货物 
    sort(v, v+n);//货物体积进行降序排列
    for(int i = 0; i < n; i++){
        tmp += v[i];
        if(tmp <= V)ans++;
        else break;
    }
     cout<<"货车能装入的货物最大数量为"<<ans<<' '<<endl;
    return 0;
}