PHP实现的装箱算法示例


Posted in PHP onJune 23, 2018

本文实例讲述了PHP实现的装箱算法。分享给大家供大家参考,具体如下:

贪婪法是一种不追求最优解,只希望得到较为满意解的方法。贪婪法一般可以快速得到满意的解,因为它省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪婪法常以当前情况为基础作最优选择,而不考虑各种可能的整体情况,所以贪婪法不要回溯。

例如平时购物找钱时,为使找回的零钱的硬币数最少,不考虑找零钱的所有各种发表方案,而是从最大面值的币种开始,按递减的顺序考虑各币种,先尽量用大面值的币种,当不足大面值币种的金额时才去考虑下一种较小面值的币种。这就是在使用贪婪法。这种方法在这里总是最优,是因为银行对其发行的硬币种类和硬币面值的巧妙安排。如只有面值分别为1、5和11单位的硬币,而希望找回总额为15单位的硬币。按贪婪算法,应找1个11单位面值的硬币和4个1单位面值的硬币,共找回5个硬币。但最优的解应是3个5单位面值的硬币。

【问题】 装箱问题

问题描述:装箱问题可简述如下:设有编号为0、1、…、n-1的n种物品,体积分别为v0、v1、…、vn-1。将这n种物品装到容量都为V的若干箱子里。约定这n种物品的体积均不超过V,即对于0≤i<n,有0<vi≤V。不同的装箱方案所需要的箱子数目可能不同。装箱问题要求使装尽这n种物品的箱子数要少。

若考察将n种物品的集合分划成n个或小于n个物品的所有子集,最优解就可以找到。但所有可能划分的总数太大。对适当大的n,找出所有可能的划分要花费的时间是无法承受的。为此,对装箱问题采用非常简单的近似算法,即贪婪法。该算法依次将物品放到它第一个能放进去的箱子中,该算法虽不能保证找到最优解,但还是能找到非常好的解。不失一般性,设n件物品的体积是按从大到小排好序的,即有v0≥v1≥…≥vn-1。如不满足上述要求,只要先对这n件物品按它们的体积从大到小排序,然后按排序结果对物品重新编号即可。装箱算法简单描述如下:

{ 输入箱子的容积;
输入物品种数n;
按体积从大到小顺序,输入各物品的体积;
预置已用箱子链为空;
预置已用箱子计数器box_count为0;
for (i=0;i<n;i++)
{ 从已用的第一只箱子开始顺序寻找能放入物品i 的箱子j;
if (已用箱子都不能再放物品i)
{ 另用一个箱子,并将物品i放入该箱子;
box_count++;
}
else
将物品i放入箱子j;
}
}
上述算法能求出需要的箱子数box_count,并能求出各箱子所装物品。下面的例子说明该算法不一定能找到最优解,设有6种物品,它们的体积分别为:60、45、35、20、20和20单位体积,箱子的容积为100个单位体积。按上述算法计算,需三只箱子,各箱子所装物品分别为:第一只箱子装物品1、3;第二只箱子装物品2、4、5;第三只箱子装物品6。而最优解为两只箱子,分别装物品1、4、5和2、3、6。
若每只箱子所装物品用链表来表示,链表首结点指针存于一个结构中,结构记录尚剩余的空间量和该箱子所装物品链表的首指针。另将全部箱子的信息也构成链表。以下是按以上算法编写的程序。
}

附php示例:

<?php
//物品
$items[0] = 60;
$items[1] = 45;
$items[2] = 35;
$items[3] = 20;
$items[4] = 20;
$items[5] = 20;
$box_volume_count = 100; //每个盒 子的最大容积
$box_count = 0; //共用盒子总数
$item_count = count( $items );
$box = array();//盒 子数组
for ( $itemindex = 0; $itemindex < $item_count; $itemindex++ ) {
$_box_index = false;
$_box_count = count( $box );
for ( $box_index = 0; $box_index < $_box_count; $box_index++ ) {
 if ( $box[$box_index]['volume'] + $items[$itemindex] <= $box_volume_count ) {
 $_box_index = $box_index;
 break;
 }
}
if ( $_box_index === false ) {
 $box[$_box_count]['volume'] = $items[$itemindex];
 $box[$_box_count]['items'][] = $itemindex;
 $box_count++;
} else {
 $box[$_box_index]['volume'] += $items[$itemindex];
 $box[$_box_index]['items'][] = $itemindex;
}
}
print_r( $box );
?>

运行结果:

Array
(
    [0] => Array
        (
            [volume] => 95
            [items] => Array
                (
                    [0] => 0
                    [1] => 2
                )
        )
    [1] => Array
        (
            [volume] => 85
            [items] => Array
                (
                    [0] => 1
                    [1] => 3
                    [2] => 4
                )
        )
    [2] => Array
        (
            [volume] => 20
            [items] => Array
                (
                    [0] => 5
                )
        )
)

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php.ini中的php-5.2.0配置指令详解
Mar 27 PHP
ie6 动态缩略图不显示的原因
Jun 21 PHP
phpMyadmin 用户权限中英对照
Apr 02 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
Jan 12 PHP
php网页标题中文乱码的有效解决方法
Mar 05 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
php实现中文字符截取防乱码方法汇总
Apr 29 PHP
PHP中iconv函数知识汇总
Jul 02 PHP
详谈PHP程序Laravel 5框架的优化技巧
Jul 18 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
May 21 PHP
php上传后台无法收到数据解决方法
Oct 28 PHP
php的instanceof和判断闭包Closure操作示例
Jan 26 PHP
PHP基于curl模拟post提交json数据示例
Jun 22 #PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
Jun 22 #PHP
PHP实现将base64编码字符串转换成图片示例
Jun 22 #PHP
PHP实现正则匹配所有括号中的内容
Jun 22 #PHP
PHP实现 APP端微信支付功能
Jun 22 #PHP
thinkPHP实现基于ajax的评论回复功能
Jun 22 #PHP
php strftime函数的详细用法
Jun 21 #PHP
You might like
PHP 时间日期操作实战
2011/08/26 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
2014/08/25 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
js获取url中&quot;?&quot;后面的字串方法
2014/05/15 Javascript
基于node实现websocket协议
2016/04/25 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
js操作二进制数据方法
2018/03/03 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
微信小程序swiper实现文字纵向轮播提示效果
2020/01/21 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
Vue使用Element实现增删改查+打包的步骤
2020/11/25 Vue.js
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
python使用Geany编辑器配置方法
2020/02/21 Python
使用CSS变量实现炫酷惊人的悬浮效果
2019/04/26 HTML / CSS
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
新员工入职感言
2014/02/01 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
元旦晚会感言
2014/03/12 职场文书
体育教师求职信
2014/05/24 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
小学清明节活动总结
2014/07/04 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
企业战略合作意向书
2015/05/08 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书
Python 实现Mac 屏幕截图详解
2021/10/05 Python
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电
MySQL详细讲解变量variables的用法
2022/06/21 MySQL