贪心算法之装箱问题
admin
2024-04-16 17:47:26
0

问题描述:

    有一些箱子,容量为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、求解思路

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

void GoodsSort(Goods goods[], int n)
{int i, j;Goods t;for (i = 0; i 



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

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

GBox * GoodsBox(Goods goods[], int n)
{GNode *h = NULL, *pg, *t;GBox *hbox = NULL, *pb, *qb;int i;for (i = 0; igno = 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;//找到箱子,跳出whileelse{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;

相关内容

热门资讯

安卓手机系统画画app,绘画A... 你有没有发现,现在手机里的画画应用越来越丰富了?尤其是安卓手机,简直就是一个小型的艺术殿堂!今天,就...
安卓和苹果系统游戏互通,游戏互... 你知道吗?在科技飞速发展的今天,手机游戏已经成为了我们生活中不可或缺的一部分。而说到手机游戏,安卓和...
封装安卓系统怎么安装app,轻... 你有没有想过,为什么你的安卓手机里有些APP就是找不到安装的地方呢?别急,今天就来给你揭秘如何给封装...
安卓系统历史更新在哪关,安卓系... 你有没有发现,每次打开你的安卓手机,系统都会提醒你更新?是不是有时候觉得更新太慢,或者更新后手机变得...
安卓刷win11系统,探索刷入... 你有没有想过,你的安卓手机或者平板,竟然也能装上Windows 11系统呢?没错,就是那个在电脑上大...
车机导航改为安卓系统,安卓系统... 你有没有发现,现在的车机导航系统越来越智能了?不过,你知道吗?最近有个大变化,那就是很多车主都在把车...
安卓系统翻盖手机型号,盘点安卓... 你有没有想过,在这个智能机横行的时代,竟然还有翻盖手机的存在?没错,就是那种一按就能翻盖,仿佛回到了...
学科网作业系统安卓,学科网作业... 你有没有发现,现在学习工具越来越智能了?这不,最近我发现了一个超级好用的学科网作业系统安卓版,简直让...
安卓系统水印怎么开启,开启安卓... 你有没有发现,有时候安卓手机屏幕上会出现一些水印,看起来还挺酷的?别小看这些水印,它们可是隐藏着不少...
安卓系统免费音乐软件,探索安卓... 你有没有发现,手机里总是缺了点什么?没错,就是那首能让你心情大好的音乐!别急,今天我就要给你安利几款...
旧款诺基亚改安卓系统,安卓系统... 你有没有想过,那些曾经陪伴我们度过无数时光的旧款诺基亚手机,现在竟然可以摇身一变,成为安卓系统的忠实...
什么叫安卓系统啊,从定义到应用... 你有没有想过,为什么你的手机可以随时随地帮你导航、拍照、聊天呢?这都要归功于一个神奇的系统——安卓系...
安卓7.1系统可以养猫,与猫咪... 你知道吗?最近有个话题在互联网上炒得火热,那就是安卓7.1系统竟然可以养猫!是不是听起来有点不可思议...
安卓开发任务管理系统,Andr... 你有没有想过,作为一个安卓开发者,每天面对那么多任务,要是能有个得力的助手来帮你管理这些琐事,那该多...
安卓系统卡开放性,解锁无限创新... 你有没有发现,安卓系统自从问世以来,就一直是手机界的“人气王”。它那开放性的特点,让无数开发者为之疯...
安卓系统如何抓包软件,安卓系统... 你有没有想过,手机里的安卓系统竟然也能玩出抓包软件的把戏?没错,就是那种可以窥探网络数据的小秘密武器...
安卓系统下类似多多阅读,多多阅... 你是不是也和我一样,对手机阅读软件有着超乎寻常的热爱呢?每天闲暇时光,捧着手机,沉浸在文字的海洋里,...
安卓系统什么键盘好用,盘点最受... 手机里的键盘可是咱们日常打字的好帮手呢!你有没有想过,为什么有的人打字飞快,而有的人却总是慢吞吞的呢...
安卓系统预装应用位置,预装应用... 你有没有发现,每次打开安卓手机,总有一些应用静静地躺在那里,仿佛在对你微笑,却又让你有点摸不着头脑?...
安卓分成多少种系统类型,全面解... 你有没有想过,我们每天离不开的安卓系统,其实它内部还藏着不少秘密呢?比如说,安卓系统类型有多少种?这...