博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于近似装箱问题的思考。
阅读量:4506 次
发布时间:2019-06-08

本文共 2497 字,大约阅读时间需要 8 分钟。

有这样一个需求, 需要对一组元素进行打包(装箱),箱子的容积一定,但是至少可以装入一件物品,即使物品的体积大于箱子,求用最少的箱子装载。

该问题类似装箱。在对物体发货时候,可以达到最少的包裹数,挺有实际意义,借此研究一下装箱问题。下面代码是对与该问题的实现。由于是记录作用,文笔较为粗糙,后续修正加以详细说明。

该实现借鉴了装箱算法,关于装箱算法可以参考网络文章。如下:

http://blog.csdn.net/zhangnaigan/article/details/38352745

http://blog.csdn.net/x_i_y_u_e/article/details/46765093

具体实现代码如下:

$items = array(    0.1,0.3,0.8,0.4,0.5,0.2,1);//sort($items,SORT_DESC);defined('BOXSIZE') || define('BOXSIZE',1);function bestEncasement($items){    sort($items);    $cnt = count($items,SORT_DESC);//更加有利于装箱     $box = array();    $dealArr = array();    for($j = 0;$j<$cnt;$j++){        $lastSize = intval(BOXSIZE);        for($i = $cnt -1;$i>0;$i--){            if(in_array($i,$dealArr)){                continue;//如果该元素已经处理过则跳过            }            //探测盒子是否为空 如果为空将元素加入            if(empty($box[$j])){                $box[$j][] = $items[$i];                $dealArr[] = $i;                $lastSize -=  $items[$i];                if($items[$i]>=BOXSIZE){                    break;//空间已经存满直接跳出处理下一个盒子                }            }else{                $tmpSize =$lastSize - $items[$i];//探测盒子是否够存放该元素                if($tmpSize == 0){                    $box[$j][] = $items[$i];                    $dealArr[] = $i;                    break;//存入空间剩余0 则跳出循环  处理下一个盒子                }                if($tmpSize>0){
//足够存入盒子 探测下一个元素 $box[$j][] = $items[$i]; $lastSize -= $items[$i]; $dealArr[] = $i; continue; }else{ //不足 处理下一个盒子 break; } } } } return $box;}print_r(bestEncasement($items));

 上一个版本存在一些运算错误,读者可以自行发现,更正如下:

=BOXSIZE){ break;//空间已经存满直接跳出处理下一个盒子 } }else{ $tmpSize =bcsub($lastSize,$items[$i],2);//探测盒子是否够存放该元素 if($tmpSize == 0){ $box[$j][] = $items[$i]; $dealArr[] = $i; break;//存入空间剩余0 则跳出循环 处理下一个盒子 } if($tmpSize>0){
//足够存入盒子 探测下一个元素 $box[$j][] = $items[$i]; $lastSize = bcsub($lastSize,$items[$i],2); $dealArr[] = $i; continue; }else{ //不足 处理下一个盒子 break; } } } } return $box;}print_r(bestEncasement($items));

 

转载于:https://www.cnblogs.com/yuerdongni/p/6265495.html

你可能感兴趣的文章
Arduino基本函数介绍
查看>>
Keil C51 的printf
查看>>
关于指针
查看>>
C 語言中的 sprintf() 函數
查看>>
VMware Worstation下载安装
查看>>
Qt操作Sqlite数据库
查看>>
java生产者与消费者模式
查看>>
SPOJ #442 Searching the Graph
查看>>
窗体美化,IrisSkin2.dll的使用!
查看>>
C语言声明数组变量时,在什么情况下,可不指定数组大小
查看>>
对模拟博客园登陆的改进---软件的开发规范
查看>>
简易csv解析
查看>>
JS案例之4——Ajax多图上传
查看>>
登陆系统的设计2 - 登陆页面的三种形式
查看>>
位运算---水题
查看>>
原码 反码 补码 移码
查看>>
mysql事务之savepoint
查看>>
日常零碎总结
查看>>
循序渐进开发WinForm项目(6)--开发使用混合式Winform模块
查看>>
在WinForm应用程序中快速实现多语言的处理
查看>>