一、问题描述
设给定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++) {