贪心算法之装箱问题

算法:装箱问题 装箱问题 阅读详情

问题描述:

    有一些箱子,容量为V,同时有n个物品,每个物品有一个体积(小于等于箱子容量),要求将物品全部装入箱子中,使占用的箱子数尽量少。

贪心算法中要求每一步的解都是当前步骤中的最优解。原问题的解可以通过一系列局部最优的选择来达到,这种选择并不依赖于子问题的解。

算法思想:

1、数据结构

    要求求解箱子数目,也就是说不能确定会占用多少个箱子,因此采用链表的形式来存储箱子及其信息。

    同时,每个箱子中物品的数目也无法确定,同理采用链表来存储每个箱子中的物品信息。

由此得出数据节点的定义:

typedef struct
{
	int gno;
	int gv;
}Goods;
typedef struct node
{
	int gno;
	struct node *link;
}GNode;
typedef struct node1
{
	int remainder;
	GNode * head;
	struct node1 * next;
}GBox;

2、求解思路

    使打开的箱子数尽量少,也就是说每个箱子容积被尽可能多地占用。将物品按照体积降序排列后,再从第一个物品开始,挨个寻找能放下它的箱子,这样可以保证局部最优。

<span style="font-family:FangSong_GB2312;">void GoodsSort(Goods goods[], int n)</span>
{
	int i, j;
	Goods t;
	for (i = 0; i<n - 1; i++)
	{
		for (j = i + 1; j<n; j++)
		{
			if (goods[i].gv<goods[j].gv)
			{
				t = goods[i];
				goods[i] = goods[j];
				goods[j] = t;
			}
		}
	}
	for (i = 0; i<n; i++)
		printf("%d   %d\n", goods[i].gno, goods[i].gv);


排序完成,就可以正式开始装箱子了。

每次都从第一个箱子开始,查看它的剩余容积还能不能放下当前的物品,能放下最好咯,放不下的话就继续查看下一个箱子的剩余容量。如果所有的已经打开的箱子都放不下当前的物品,那就只好再打开一个空箱子,把它塞进去。

GBox * GoodsBox(Goods goods[], int n)
{
	GNode *h = NULL, *pg, *t;
	GBox *hbox = NULL, *pb, *qb;
	int i;
	for (i = 0; i<n; i++)/////////////////遍历货物信息数组
	{
		pg = (GNode *)malloc(sizeof(GNode));///////////////分配货物节点单元
		pg->gno = goods[i].gno;
		pg->link = NULL;//货物节点初始化
		if (!hbox)//若一个箱子都没有
		{
			hbox = (GBox *)malloc(sizeof(GBox));
			hbox->remainder = 10;
			hbox->head = NULL;
			hbox->next = NULL;
			
		}
		qb=pb = hbox;//都指向箱子头
		while (pb)//找箱子
		{
			if (pb->remainder >= goods[i].gv)/////////////////////////////能装下
				break;//找到箱子,跳出while
			else
			{

				qb = pb;
				pb = pb->next;//qb是前驱
			}

		}/////////////////////////////////////遍历箱子结束
		if (pb==NULL)/////////////////////需要新箱子
		{
			pb = (GBox *)malloc(sizeof(GBox));//分配箱子
			pb->head = NULL;
			pb->next = NULL;
			pb->remainder = 10;//初始体积
			qb->next = pb;//前驱指上
			

		}
		if (!pb->head)//如果箱子里没货
		{
			pb->head = pg;
			t = pb->head;
		}
		else
		{
			t = pb->head;
			while (t->link) t = t->link;//货尾  尾插
			t->link = pg;
		}
		pb->remainder -= goods[i].gv;
			
			////////////////////////////////////装箱

	}
	return hbox;



异形图片自动排版之《装箱算法》 序章 本文主要介绍计算机图形通过系统自动识别,计算出以最紧凑、利用率最高的方式排列,主要应用于服装类行业,印刷行业,字体雕刻行业等领域,能够使企业以最节省材料的方式生产,降低企业的生产成本。本文主要讲解装箱算法理论的主要设计思路,通过人类最复杂的大脑转化为算法代码后的人工智能方案。这个方案是否可行很多人肯定会存在疑问,这里直接在下方上结果,至于是否存在漏洞或不可解决的地方,这个要看我们大脑是否不能解决,可在评论区提出。将不规则的图形随机顺序排列:通过装箱算法生成结果,这里只采用图形每次90度旋转。 阅读详情

相关推荐

贪心算法 之 装箱问题

贪心算法 之 装箱问题(可得到最优解的近似解) 1.贪婪准则: 1&gt;贪婪准则设计算法的每一步的最优解(局部最优) 2&gt;贪心准则一旦设好,中途不变 2.贪婪准则并不一定能得到最优解: 装箱问题: 有若干个体积为V的箱子; 有N个物品体积为:v0,v1,v2,v3....... 要求: 将所有的物品装入箱子中,使得打开的箱子最少; 贪婪准则: 1.将所有物品按照体积降序排列; ...

zuo_h_dr的博客 4019

【课程·研】算法 | 装箱问题(近似算法)

本文主要内容: 1. 问题描述 2. 问题分析 3. 本文算法设计思想与算法描述 4. 算法复杂性分析与算法近似比 5. 算法实现 6. 测试结果 1. 问题描述 设有n个物品S和若干个容量为C的箱子B,n个物品的体积分别为{s1 ,s2 ,…, sn } ,且有 si ≤ C (1≤i≤n) ,装箱问题(packing problem)把所有物品分别装入箱子,求占用箱子数最少的装箱方案。

拾年之璐 1万+

贪心算法应用之一:装箱问题

关于贪心算法: 即通过保证局部最优来求得最优解的一种思维。 关键在于:设置贪心准则。贪心准则一旦确定,中途不能改变。 装箱问题描述、分析、代码实现

zhangdoudou0626的博客 1万+

【算法】装箱问题

Bin-Packing算法是解决资源优化分配问题的算法,旨在将多个物品有效地装入有限数量的容器中,以减少使用的容器数量。常见的算法包括First Fit、Next Fit、Best Fit等,它们通过不同的策略来实现物品的装箱,如按顺序放入第一个适合的容器或选择剩余空间最小的容器。这类算法在计算机科学、物流和生产制造等领域有广泛应用,能够提高资源利用率和操作效率。

wnm23的专栏 4195

C++贪心算法之装箱问题

装箱问题 Description 一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6。这些产品通常使用一个 6*6*h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你

The most secret blogs 1万+

C++ 之 贪心算法 (装箱问题)

装箱问题Time Limit: 1000ms Memory Limit: 65536kBDescription一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6。这些产品通常使用一个 6*6*h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们

你的心,如何追逐? 3835

贪心算法--装箱问题

贪心算法–装箱问题还在持续学习中,如有什么纰漏,请在评论区加以指正……简单认识贪心算法贪心算法,在我最初的理解里就是贪心,什么都想要最好的。那么,这就正符合了贪心算法在运用过程中的特点--即贪心算法总是做出当前看来是最好的选择。那么这样也就决定了贪心算法不从整体最优上考虑问题,而是在每一步实现过程中实现最优,从而其计算出来的最终结果必然只是一个最接近最优解的结果,而并不一定是最优解。 贪心准则 贪心

neoma_Tay的博客 7055

贪心算法——装箱问题

描述 一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为11, 22, 33, 44, 55, 66。这些产品通常使用一个 66h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。 输入 输入文件包括几行,每一行代表一个订单...

m0_46238203的博客 1244

装箱问题之贪心算法

将问题的每一步抽象出一个公共的最优解。注意:在一步中不一定能找到最优解:简单快速,容易想清楚问题。

m0_62089210的博客 1061

基于贪心算法的矩形地块二维装箱问题优化

矩形地块二维装箱问题是指:在二维平面内有若干个不同大小的矩形地块,如何将它们放置在一个矩形区域内,使得所需的空间最小化。该问题涉及到物品(矩形地块)的排列和旋转,以及空间利用的最大化,是一个典型的NP难问题。以上就是基于贪心算法求解矩形地块二维装箱问题的方法和MATLAB实现代码。贪心算法是一种求解优化问题的常用方法,在矩形地块二维装箱问题中也可以起到一定的优化作用。本文将介绍如何使用贪心算法对矩形地块二维装箱问题进行优化求解,并提供相应的MATLAB代码实现。基于贪心算法的矩形地块二维装箱问题优化。

m0_47037246的博客 618

Silvaco光电探测学习笔记(一)——有关响应和暗电流

习惯用md记笔记,索性发出来,一是为了在线同步,二是希望能帮到需要的人。

qq_41584406的博客 8012

【算法】贪心算法之背包与装箱问题

一:背包问题可以有很多变种,比如下面几个: 我们有n种物品,物品j的重量为wj,价格为pj。我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。 如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题。可以用公式表示为: 最大化  受限于  如果限定物品j最多只能选择bj个,则问题称为有界背包问题。可以用公式表示为: 最大化  受限于  如果不限定

zwan0518的专栏 8813

宇树机器人G1二次开发:语音对话、打断与激活功能实现指南

宇树机器人G1是一款功能强大的四足机器人,其开放的SDK和API为开发者提供了广阔的二次开发空间。其中,语音交互是提升机器人智能化水平和用户体验的关键功能。本文将详细介绍如何在宇树机器人G1上进行二次开发,实现。语音打断允许用户在机器人说话时随时中断并输入新指令,这是提升交互自然度的关键功能。三大核心功能,帮助你构建更自然、更智能的人机交互系统。语音识别是将用户的语音输入转换为文本的过程。识别文本后,需要理解用户意图并生成回复。将文本回复转换为语音输出。

m0_52645558的博客 664

贪心算法应用:装箱问题(BFD算法)详解

贪心算法应用:装箱问题(BFD算法)详解

专注分享技术、实用优质教程、资源 2206

HALCON 20.11实战:5步搞定工业图像异常检测(附完整代码)

本文提供了一份基于HALCON 20.11的工业图像异常检测实战指南。通过五个核心步骤——环境准备、数据预处理、模型训练、推理解析与工程化部署,详细演示了如何利用深度学习技术,仅使用正常样本快速构建并优化金属表面划痕等缺陷的检测模型,并附有完整可运行的HDevelop代码,助力工程师实现高效、智能的工业视觉质检。

weixin_29243279的博客 140

【GB28181】wvp-GB28181-pro++ZLMediaKit编译安装国标流媒体服务器教程(Windows平台)

本文基于ZMLMediaKit+WVP-PRO在windows平台进行编译部署GB28181平台,网上教程也比较多,都大同小异,实际操作过程中容易出错的地方也比较多:redis安装无密码,mysql安装后密码的修改以及wvp数据可的创建,配置文件侧修改,尤其是和端口相关的项,再就是运行服务时各种错误需要注意,常见的错误已经做了汇总,遇到问题大家不要怕,找到报错的地方查看定位即可。

废人一枚的博客 4479

贪心算法(装箱问题)

贪心算法的基本思想是找出整体当中每个小的局部的最优解,并且将所有的这些局部最优解合起来形成整体上的一个最优解。因此能够使用贪心算法的问题必须满足下面的两个性质: 1.整体的最优解可以通过局部的最优解来求出; 2.一个整体能够被分为多个局部,并且这些局部都能够求出最优解。 3.局部最优解不一定能得到整体最优解。   贪心算法之装箱问题: 有若干个体积为V的箱子,有n个物品体积为v1,v2...

qq_39241239的博客 5342

【光子 AI 】LangGraph:Graph = 有向有环图 + 状态机实现原理详解:数据结构模型与核心算法代码实现逻辑解析

LangGraph核心原理解析:基于Pregel模型的消息传递图,结合有向有环图和状态机特性。关键实现包括:1) 共享状态机制(TypedDict/Pydantic模型)配合Reducer逻辑实现状态更新;2) 图拓扑结构通过邻接表维护节点和条件边;3) 检查点机制支持状态持久化和恢复。运行时采用Pregel循环算法,通过超级步迭代执行节点函数、应用状态归约、条件路由下一批节点,同时支持人工中断和异步并行处理。该架构使LangGraph具备循环执行、条件跳转等DAG无法实现的动态流程控制能力。

AI天才研究院 1036

贪心算法解装箱问题

贪心算法解装箱问题 问题描述 有N个物品,其重量大小为W,其取值范围为0<W<=V,有一批容量为V的箱子,问最少需要多少个箱子可以把这些物品装上。 思路 利用回溯和减枝是肯定可以的,毕竟是一种穷举。也可以利用动态规划方法来解决。本题主要讨论贪心算法的解决方法,其主要思想是每次选择都选择最优的,即让箱子每次都装能让箱子承受的住的最大重量,若遍历所有物品都没有能让箱子承受的住的,则换下一个箱子来装。其主要思想就跟有一张整的纸币,要将其换成10元,5元,1元的纸币,要求是换出的纸币的数量最少一样,那肯

qq_50271250的博客 1589

华为OD新系统机试真题 2026.5.10 - 美观的灯笼

华为OD新系统机试真题【美观的灯笼】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【美观的灯笼】

qq_45776114的博客 643

【WorkBuddy专栏58】腾讯为什么要「自己打自己」——7款AI智能体产品全景对比与「赛马」逻辑深度拆解

【WorkBuddy专栏57】你的左侧空间不是「日任务清单」——工作空间才是 WB 变聪明的核心秘密

AI人人懂 679
上一篇: 二分查找
下一篇: C语言内存管理机制的一点小问题
祝大余
博客等级 码龄13年 74粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值