装箱问题(贪婪策略:首次适应递减(First Fit Decreasing, FFD))

装箱问题(贪婪策略:首次适应递减(First Fit Decreasing, FFD))

装箱问题是一种典型的组合优化问题,它可以用多种贪婪(greedy)策略来解决。贪婪算法通过在每一步选择当前最优的解决方案,希望这样会导致全局最优解。

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

代码如下:

//装箱问题
#include <stdio.h>
#include <malloc.h>
#define V 10 //一个箱子所能装的最大体积//物品信息
typedef struct 
{int gnum; //物品编号int gv; //物品体积
}Goods;//物品链
typedef struct Node
{int gnum;struct Node *next; //连接下一个物品
}GoodsLink;//箱子链
typedef struct Box
{int bv; //箱子体积struct Box *next; //下一个箱子struct Node *hg; //箱子上的物品节点
}BoxLink;//物品体积降序排列
//冒泡排序法进行排序
Goods *SortGoods(Goods *g,int n) 
{for(int i=0;i<n-1;i++){for(int j=0;i+j<n-1;j++){if(g[j+1].gv>g[j].gv){Goods t=g[j];g[j]=g[j+1];g[j+1]=t;}}}return g;
}//装箱
BoxLink *CreateBoxLink(Goods *g,int n)
{GoodsLink *pg,*qg;BoxLink *pbox,*hbox=NULL,*t;for(int i=0;i<n;i++){//创建物品节点pg=(GoodsLink *)malloc(sizeof(GoodsLink));pg->gnum=g[i].gnum;pg->next=NULL; //判断是否需要创建新的箱子节点//判断条件:箱子结点不为空&&该物品的体积大于箱子所剩余的体积for(pbox=hbox;pbox&&(pbox->bv<g[i].gv);pbox=pbox->next); //如果没有找到合适的箱子创建箱子节点if(!pbox){//创建新的箱子节点pbox=(BoxLink *)malloc(sizeof(BoxLink));pbox->bv=V;pbox->hg=NULL;pbox->next=NULL;if(!hbox) //判断箱子链表是否为空hbox=t=pbox;elset=t->next=pbox; } //不执行if:表示有箱子可以放的下物品pbox->bv-=g[i].gv;          //用剩余箱子体积减去当前的物品体积if(!pbox->hg)                  //在当前箱子上挂物品,判断箱子上是否有物品pbox->hg=pg;          //该物品是这个箱子的第一个物品节点else {for(qg=pbox->hg;qg->next;qg=qg->next);          //找到挂物品所要挂的位置qg->next=pg;             //将物品挂在找到的节点上}}return hbox;
}//输出每个箱子所装的物品
void PrintBox(BoxLink *hbox)
{int cnt=0;for(BoxLink *pbox=hbox;pbox;pbox=pbox->next){printf("第%d个箱子所放的物品编号:",++cnt); for(GoodsLink *pg=pbox->hg;pg;pg=pg->next)printf("%2d",pg->gnum); printf("\n"); }printf("\n");
} int main(void)
{int n,v;Goods *g;BoxLink *hbox;printf("请输入物品的个数:");scanf("%d",&n);printf("\n");g=(Goods *)malloc(n*sizeof(Goods)); //定义物品信息//初始化物品信息for(int i=0;i<n;i++){printf("请输入第%d件物品体积: ",i+1);scanf("%d",&v);g[i].gv=v;g[i].gnum=i+1;}printf("\n");g=SortGoods(g,n); //物品体积降序排列hbox=CreateBoxLink(g,n); //装箱PrintBox(hbox); //输出每个箱子所装的物品return 0 ;
}
总体流程
  1. 输入物品信息:首先获取物品个数和每个物品的体积,并将它们存储在一个结构体数组中。
  2. 物品排序:然后对物品按体积进行降序排列,使得大物品优先被处理。
  3. 装箱:根据物品的大小和箱子的剩余容量来决定物品的放置。
  4. 输出结果:最后打印出每个箱子中包含的物品编号。
关键组件
  • 物品(Goods):包括物品编号gnum和物品体积gv的结构体。
  • 物品链(GoodsLink):用于链表形式存储每个箱子内的物品编号。
  • 箱子链(BoxLink):表示每个箱子,包含该箱子剩余体积bv、指向下一个箱子的指针next和指向该箱子内第一个物品节点的指针hg
详细解释
物品体积降序排列 SortGoods

使用冒泡排序算法对物品按体积进行降序排列。这样做的目的是尽可能优先处理大物品,便于后续的装箱操作。

装箱 CreateBoxLink
  1. 遍历每个物品,为其创建一个物品链节点。
  2. 尝试找到一个可容纳当前物品的箱子(箱子的剩余体积足够大)。
    • 如果找到合适的箱子,则更新箱子的剩余体积,并将该物品节点加入箱子的物品链中。
    • 如果没有找到合适的箱子,则新建一个箱子,并将其加入箱子链中,然后重复上述步骤。
  3. 这个过程采用贪心策略,尽量在已有的箱子中放置物品,以减少总箱子数。
输出结果 PrintBox

遍历箱子链,对于每个箱子,打印出其中包含的所有物品编号。这显示了每个箱子中物品的装载情况。

注意事项
  • SortGoods函数中,循环条件有误:for(int j=0;i+j<n-1;j++)应改为for(int j=0;j+i<n-1;j++),否则会造成无限循环或跳过排序。
  • 使用malloc分配内存时需要注意内存管理,确保在使用完毕后释放已分配的内存,避免内存泄漏。本代码未展示内存释放过程。

如果觉得文章对您有帮助,请帮忙点赞或者收藏,如果在文章中发现什么错误或不准确的地方,欢迎与我交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA推荐使用十大插件

在本文中&#xff0c;我们将介绍 10 多个最好的 IntelliJ IDEA 插件&#xff0c;以提高工作效率并在更短的时间内完成更多工作。如果将这些插件合并到您的工作流程中&#xff0c;您将能够更有效地应对开发挑战。 1、TabNine TabNine 是一个 IntelliJ IDEA 插件&#xff0c;可…

c# 获取oracle 表及表内容

1、 /// <summary> /// 获取表名列 /// </summary> /// <param name"owner"></param> private void GetTableNameList(string owner) { TableNameGridList.Clear(); GetT…

YOLOv5语义分割7.0推理代码封装

YOLOv5语义分割7.0推理代码封装 YOLOv5语义分割7.0推理代码封装 YOLOv5语义分割7.0推理代码封装 import argparse import os import numpy as np import re import sys from pathlib import Path import torchFILE = Path(__file__).resolve() ROOT = FILE.parents[1

C/C++ 纸张尺寸问题(蓝桥杯)

题目描述&#xff1a; 在 ISO 国际标准中定义了 A 0 A0A0 纸张的大小为 1189 m m 841 m m 1189mm841mm1189mm841mm&#xff0c;将 A 0 A0A0 纸沿长边对折后为 A 1 A1A1 纸&#xff0c;大小为 841 m m 594 m m 841mm594mm841mm594mm&#xff0c;在对折的过程中长度直接取下整…

CSS常用选择器(通配符选择器,标签选择器,类选择器,id选择器……),你知道了多少?

目录 CSS常用选择器 一、什么是选择器 二、通配符选择器 基本语法格式&#xff1a; 三、标签选择器 基本语法格式&#xff1a; 四、类选择器 基本语法格式&#xff1a; 五、id选择器 基本语法格式&#xff1a; 六、类选择器还是 ID 选择器&#xff1f; 区别 1&…

芯片设计后端遇到的各种文件类型和文件后缀

芯片设计后端遇到的各种文件类型和文件后缀 文件类型 描述 文件后缀 netlist网表文件 verilog文件格式&#xff0c;记录了芯片里各个instance的逻辑连接关系 .v (for Verilog netlists) Lib&#xff0c;liberty timing file 记录了cell的timing信息及一定power信息。有的…

Python自动化测试:API接口自动化——requests、webSocket

接口自动化测试1 一、requests二、简单示例1.导入/引入库2.请求与响应示例1>简单访问百度主页-GET请求2>简单的登录请求-POST请求3>保存cookies至头信息headers4>其他接口请求时携带headers 三、webSocketwebSocket连接与数据收发示例 本文介绍了借助Python的reque…

leetcode-重复的子字符串

459. 重复的子字符串 题解&#xff1a; 首先&#xff0c;我们需要找到字符串s的所有子串。然后&#xff0c;我们需要检查这些子串是否可以通过重复多次构成原字符串s。如果找到了这样的子串&#xff0c;返回True&#xff0c;否则返回False。 class Solution:def repeatedSub…

什么是同源策略?如何检测跨站点 WebSocket 劫持漏洞?post 表单跳转跨域问题、Ajax跨域请求、浏览器特性和安全策略、WebSocket 协议连接

什么是同源策略?如何检测跨站点 WebSocket 劫持漏洞?post 表单跳转跨域问题、Ajax跨域请求、浏览器特性和安全策略、WebSocket 协议连接。 同源策略(Same Origin Policy)是一种浏览器安全机制,用于保护用户的信息和数据安全。它限制了来自不同源(协议、域名、端口)的网页…

华为手环 8:返校季新宠,助力高效学习与健康生活

随着春节假期的结束&#xff0c;学生们也纷纷踏上了返校的旅途。新的学期&#xff0c;新的气象&#xff0c;让华为手环8为你的带来全新的智能生活体验。它不仅仅是一款风格多变的时尚手环&#xff0c;还拥有了智能消息提醒、100多种运动模式和睡眠监测等强大功能&#xff0c;让…

计算机设计大赛 深度学习疲劳驾驶检测 opencv python

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 &#x1f525; 优…

基于springboot实现粮食仓库管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现粮食仓库管理系统演示 摘要 粮食作为人类生活的重要物质来源&#xff0c;在粮食流通过程中对于粮食仓库的管理不容忽视&#xff0c;随着我国粮食生产能力的提升以粮食存储管理的不断革新&#xff0c;粮食产量的增加为粮食仓储管理带来了挑战也带来了机遇&am…

蜂窝物联:物联网大数据云平台功能模块简介

蜂窝云平台可远程获取现场环境&#xff08;如温室大棚、稻田&#xff09;的空气温湿度、土壤水分温度、二氧化碳浓度、光照强度及视频图像&#xff0c;通过数据模型分析&#xff0c;可以自动控制湿帘、风机、喷淋滴灌、内外遮阳、顶窗侧窗、加温补光、增氧机等设备&#xff1b;…

Java零基础-包机制

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

实践课项目化

程序设计实践 项目内容&#xff1a; 这是一门物联网工程专业的必修课程&#xff0c;基于大学计算机基础和C编程课程&#xff0c;要求使用C语言设计和实现一个小型信息管理系统。课程提供两个小项目供学生选择&#xff0c;学生分组完成其中一个项目&#xff0c;每组5人。 成果…

MySQL面试题-锁(答案版)

锁 1、MySQL 有哪些锁&#xff1f; &#xff08;1&#xff09;全局锁 加了全局锁之后&#xff0c;整个数据库就处于只读状态了&#xff0c;这时其他线程执行以下操作&#xff0c;都会被阻塞&#xff1a; 对数据的增删改操作&#xff0c;比如 insert、delete、update等语句&…

C# 异步操作汇总

在C#中&#xff0c;异步操作&#xff08;Asynchronous Operations&#xff09;可以提高程序的性能和响应能力。通常情况下&#xff0c;程序会等待某个操作完成之后才会继续执行下一个操作&#xff0c;这会导致程序的运行速度变慢。而异步操作可以让程序在等待某个操作完成的同时…

【深度学习笔记】计算机视觉——R-CNN

区域卷积神经网络&#xff08;R-CNN&#xff09;系列 sec_rcnn 除了 sec_ssd中描述的单发多框检测之外&#xff0c; 区域卷积神经网络&#xff08;region-based CNN或regions with CNN features&#xff0c;R-CNN&#xff09; Girshick.Donahue.Darrell.ea.2014也是将深度模型…

Bagels系列|python小程序随手记

来自《The Big Book of Small Python Projects》 import randomNUM_DIGITS 3 MAX_GUESSES 10 def main():print(Bagels, a deductive logic game. I am thinking of a {}-digit number with no repeated digits. Try to guess what it is. Here are some clues: When I sa…

知识图谱辅助的个性化推荐系统

知识图谱辅助的个性化推荐系统 将从下面4个方面展开&#xff1a; 推荐系统的基础知识知识图谱辅助的推荐方法介绍基于embedding的知识图谱推荐方法混合型知识图谱推荐方法 推荐系统的基础知识 1、什么是推荐系统 在当前互联网时代&#xff0c;推荐系统是所有面向用户的互联…