现有包裹箱子体积固定为300,如何拆分订单商品。
拆分包裹条件:
1、最小化拆分包裹,不能浪费箱子
2、每个商品的体积是单个的,总体积= 商品数量 X 单个体积
3、商品可以随意搭配装箱,只要满足最后的条件,箱子最小化,不浪费一个箱子
4、比如:有些商品装3个就满了,但是它有8个,也要拆开放下一个箱子
5、使用PHP语言,这个算法应该如何写?
/** * 分框算法第三期:2020-11-25 10:42:39 * 按商品的体积分框,体积 X 数量 * 贪婪算法分框打包 * @param $items * @return array */ function soft_goods($items) { if(empty($items)) return []; // 商品列表 items按商品体积拆分 $box_volume_count = 200000000; // 仓库发货框的体积(立毫米) $box_count = 0; // 分框框的数量 $item_count = count($items); $box = array();// 发货框数组 foreach ($items as $k => $v){ $_box_index = false; $_box_count = count($box); for ($box_index = 0; $box_index < $_box_count; $box_index++) { if ($box[$box_index]['volume'] + $items[$k]['volume'] <= $box_volume_count) { $_box_index = $box_index; break; } } if ($_box_index === false) { $box[$_box_count]['volume'] = $items[$k]['volume']; // 单个框累积总体积 $box[$_box_count]['items'][] = $v; $box_count++; } else { $box[$_box_index]['volume'] += $items[$k]['volume']; $box[$_box_index]['items'][] = $v; } } return $box; }
现有php订单商品列表数组如下:
$goods = [ 20200702024 => [ "name" => "LP-雨伞", // 商品名称 "bar_code" => "20200702024", // 条形码 "quantity" => "3", // 数量 "scan_mode" => "5", // 发货模式 "volume" => "15.6", // 体积 ], 6970328080043 => [ "name" => "压缩面膜", "bar_code" => "6970328080043", "quantity" => "1", "scan_mode" => "5", "volume" => "23", ], 6922994301816 => [ "name" => "洁面巾", "bar_code" => "6922994301816", "quantity" => "5", "scan_mode" => "3", "volume" => "20", ], 6922994300765 => [ "name" => "鲜藻精华面膜", "bar_code" => "6922994300765", "quantity" => "11", "scan_mode" => "4", "volume" => "36", ], 6922994300192 => [ "name" => "甘菊花露水", "bar_code" => "6922994300192", "quantity" => "8", "scan_mode" => "1", "volume" => "65", ], ];
版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
关注微信公众号:"cq_xifan";