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

{ 从已用的第一只箱子开始顺序寻找能放入物品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示例:

//物品

$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 );

?>

来自:http://home.51.com/chenjiuchuan/diary/item/10049598.html

php装箱,php兑现装箱算法相关推荐

  1. 都说不要装箱,那装箱到底带来了什么开销?

    相信很有朋友在面试时大多会被问到 装箱 的问题,也是一个经典的问题,可深可浅,那今天我们就从 汇编 和 内存 角度进行统一解读下. 为了方便演示,先上一段装箱的代码. class Program{st ...

  2. java list装箱,Java 自动装箱和拆箱

    Java 自动装箱和拆箱 在本教程中,我们将借助示例学习Java自动装箱和拆箱. Java自动装箱-包装器对象的原始类型 在自动装箱中,Java编译器会自动将原始类型转换为其相应的包装器类对象.例如, ...

  3. java自动装箱性能

    2019独角兽企业重金招聘Python工程师标准>>> Java 的基本数据类型(int.double. char)都不是对象.但由于很多Java代码需要处理的是对象(Object) ...

  4. java的自动装箱和拆箱,Java中的自动装箱和拆箱是什么?

    当我们用任何语言编写程序时,大多数时候我们使用原始数据类型,.但是,在面向对象编程领域,有些情况下原始数据类型会出现不足,而Java就是其中之一.为了克服原始数据类型的缺点,我们 当我们用任何语言编写 ...

  5. 使用接口改变已经装箱的值类型的字段

    使用接口改变已经装箱的值类型的字段. using System; using System.Collections.Generic; using System.Text; namespace App1 ...

  6. java基础第十一篇之Date、Math、自动装箱和拆箱

    Date类 表示一个瞬间,就是一个时刻 * * 构造方法: * public Date();//创建一个表示当前系统时间的Date对象 * public Date(long time);//毫秒值,距 ...

  7. Java 自动装箱性能

    Java 的基本数据类型(int.double. char)都不是对象.但由于很多Java代码需要处理的是对象(Object),Java给所有基本类型提供了包装类(Integer.Double.Cha ...

  8. Java的自动装箱与自动拆箱

    一:什么是自动装箱拆箱 装箱就是自动将基本数据类型转换为包装器类型: 拆箱就是自动将包装器类型转换为基本数据类型. java中需要装箱拆箱的类型如下: 基本数据类型 包装器类型 int(4字节) In ...

  9. [C#] C# 知识回顾 - 装箱与拆箱

    装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 读者见解 生活中的装箱与拆箱    我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃 ...

最新文章

  1. 一个故事讲清楚BIO NIO 异步
  2. SAP内向交货详解 Details on SAP inbound delivery
  3. boost::shared_ptr用法测试程序
  4. 免费送《你的知识需要管理》签名书活动,秒杀
  5. 将进酒,如果李白也编程
  6. iOS通过ASIHTTPRequest提交JSON数据
  7. 淘宝二手闲鱼平台按关键词搜索闲鱼商品接口,item_search-按关键字搜索闲鱼商品接口接入说明方案
  8. 安装Kali Linux渗透系统
  9. 汉诺塔(Hanoi Tower)
  10. 推荐几本学习Java的教材
  11. “十问”彻底弄懂APS、ERP、MES的集成问题
  12. 手机那点事!已有高人把常见的不常见的坑都给找出来了,我就随便转一下了
  13. java logout_Java Core.logout方法代碼示例
  14. C语言入门条件运算符
  15. 玩转NVIDIA Jetson AGX Xavier
  16. quectel(短消息服务命令)9
  17. 华盛顿大学计算机科学,华盛顿大学计算机科学与信息系统Computer Science and Information Systems世界排名2020年最新排名第18位(QS世界排名)...
  18. 删除压缩包密码的方式有几种?
  19. Excel 2010 VBA 入门 006 设置宏安全性
  20. 看过来!2021年最新PMP报名流程来了

热门文章

  1. 阿里云开放国内首个云端数据库测试平台,云已成为数据库新标准;华为5G随行WiFi发布;科大讯飞推出 AI 专用语音芯片系列……...
  2. K8S精华问答 | Kubernetes集群常见问题
  3. 滴滴全链路压测解决之道 | 技术头条
  4. 英特尔助力金山云带你畅游云端的游戏世界
  5. gitlab git clone 卡住_gitlab从入门到绝望
  6. @Transactional注解导致 多数据源@DS无效 的解决方案
  7. 怎样修改当前分支最新一次提交的message信息?
  8. 工作流实战_04_flowable 流程的模板的图片和xml显示
  9. 工作流实战_02_flowable 流程模板导入
  10. python中idle怎么打开_为什么我的python脚本只打开IDLE?