近似装箱问题

一、问题描述

设给定N项物品, 大小为s1, s2, s3, …, sn, 每个物品的都不超过1; 现有大小为1的箱子若干个, 将物品装入箱子中, 尽量使用少的箱子装满所有物品;
实例:
现有一列物品:0.2, 0.5, 0.4, 0.7, 0.1, 0.3, 0.8;其中一种装箱方案如下所示:
在这里插入图片描述
装箱问题是一个NP完全问题, NP完全问题的最优解的时间复杂度不能是一个二项式的(通常NP问题的时间复杂度是指数型的);因此, 当获知这是一个NP完全问题, 就要考虑不纠结于求解其最优解,通常求解器近似解,并且近似解的时间复杂度很小;

二、区分联机算法与脱机算法

1) 联机算法
联机算法相当于输入数据不是一次性传递到算法的,每来一个数据, 算法就要处理这个数据;算法对已经处理过的数据并不能修改, 算法对未来的数据也无法预测;

2) 脱机算法
脱机算法的输入数据通常是一组事先已知的数据, 算法可以对数据进行预先处理,例如排序。之后在进行装箱算法。一般脱机算法能够得到更优的解;

三、近似装箱问题的求解算法

1) 下项适配(next fit)
当处理一个物品的时候, 检查当前箱子容量是否足够;如果足够, 就将物品放入当前箱子, 如果不足, 就重新开辟一个新的箱子;
下项适配的代码如下:

#include <stdio.h>
#include <stdlib.h>

#define N 7
float item[] = {
    0.2, 0.5, 0.4, 0.7, 0.1, 0.3, 0.8 };
float box[N] = {
    1, 1, 1, 1, 1, 1, 1 };
int flags[N] = {
    0 };

void binningNextFit() {
   
	int index = 0;
	for (int i = 0; i < N; i++) {
   
		
  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值