标题:分箱子问题(贪婪算法)

摘要:装箱子问题是一种常见的问题.假设我们需要将许多物品装进容量为1的箱子里面,每个物品的重量小于1.如果我们不能得知所有物品的重量,可能在装箱子的过程中有新的物品进入.现在我们要做的是求出最小的箱子数.

基本思路:

[1]:可以证明,在不能得知所有物品的情况下,算法能够给出的箱子数是不可能达到最优的.
[2]:我们给出了最简单的算法,下次适合算法.当有新的物品进入时,我们检测刚刚装过物品的箱子,如过它不能被装入,那么就开辟一个新的箱子.
[3]:该方法只考虑了一个很小的局部最优情况,但是算法效率相对较高.

include “stdafx.h”

include “malloc.h”

define N 10

typedef struct Cargostructure * Cargo;
struct Cargostructure//定义物品的结构
{
double weight;
Cargo Next;
};
struct Bins//定义箱子的结果
{
double Remains;//箱子剩余容量
Cargo Element;//箱子所装的所有物品(一个链表)
};
void Initialize_Bin(Bins bins[])
{
for (int i = 0;i<=N-1;i++)
{
bins[i].Remains = 1;
bins[i].Element = (Cargo)malloc(sizeof(Cargostructure));
bins[i].Element->weight = 0;
bins[i].Element->Next = NULL;
}
}
void Insert(Cargo C,double cargo)
{
Cargo temp;
temp = C;
while(C->Next!=NULL)
C = C->Next;

C->Next = (Cargo)malloc(sizeof(Cargostructure));
C = C->Next;
C->weight = cargo;
C->Next  = NULL;
C = temp;

}

void nextFit(double cargo,Bins bins[])
{
int static index = 0;
if (bins[index].Remains >= cargo)
bins[index].Remains -= cargo;
else
bins[++index].Remains = 1 - cargo;//开新箱子
//将货物放入箱子
Insert(bins[index].Element,cargo);
}

int _tmain(int argc, _TCHAR* argv[])
{

Bins bins[N];
Initialize_Bin(bins);
double weight[] = {0.2,0.5,0.4,0.7,0.1,0.3,0.8};
for(int i = 0;i<=6;i++)
nextFit(weight[i],bins);
return 0;

}

你可能感兴趣的:(标题:分箱子问题(贪婪算法))