一批有顺序的包裹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;
}