贪心准则:
①将一个问题的n步的每一步抽象出公共的最优解
②一个问题只有一个贪心准则,问题在求解时贪心准则不许改变。
☆特点:不一定产生最优解,但,简单,快速。
装箱问题
问题描述:
①有n个物品,体积V1,V2,V3…Vn
②有若干个体积为V的箱子。
要求:将n个物品全部装入箱子中,打开的箱子尽量少。
贪心准则:
①降所有物品按体积按降序排列
②按开箱顺序遍历已打开的箱子,将每一个武平装入打开较早的箱子
算法描述:
代码实现:
头文件
#include<stdio.h>
#include<stdlib.h>
#define N 8 //物品数目
#define V 10 //箱子体积
创建结构体
//物品信息
/*用typedef重命名或其数据不需
要结构体名时结构体名可省略*/
typedef struct{
int gno;//编号
int gv;//体积
}EGoods;
//装入箱子中物品编号结点
typedef struct goods{
int gno;//编号
struct goods *link;//后继结点
}GoodsLink;
//箱子信息结点
typedef struct box{
int restV;//箱子剩余体积
GoodsLink * hg;//所装入的物品
struct box * next;
}BoxLink;
物品按降序排序函数
//物品按降序排序
void SortD(EGoods *g)
{
EGoods t;
for(int i=0;i<N-1;i++)
for(int j=N-1;j>i;j--)
{
if(g[j].gv > g[j-1].gv)
{
t=g[j];
g[j]=g[j-1];
g[j-1]=t;
}
}
}
装箱函数
//装箱
BoxLink * PackingBox(EGoods *g)
{
BoxLink *hbox=NULL,*tbox,*pbox;//hbox为箱子的头结点,tbox为箱子的尾结点
GoodsLink *p,*q;
for(int i=0;i<N;i++)
{
//遍历所有箱子
for(pbox=hbox;pbox && pbox->restV < g[i].gv;pbox=pbox->next);
if(!pbox)//若没有箱子可以装下g[i]
{
//创建箱子结点
pbox=(BoxLink *)malloc(sizeof(BoxLink));
pbox->hg=NULL;
pbox->restV=V;
pbox->next=NULL;
if(!hbox)//如果无任何箱子
hbox=tbox=pbox;
else
tbox=tbox->next=pbox;
}
//创建所装入的物品结点
q=(GoodsLink*)malloc(sizeof(GoodsLink));
q->gno=g[i].gno;
q->link=NULL;
//装入,遍历该箱子所有物品结点
for(p=pbox->hg;p && p->link;p=p->link);
if(!p)
pbox->hg=q;
else
p->link=q;
pbox->restV-=g[i].gv;
}
return hbox;
}
输出所用箱子信息函数
//输出所用箱子信息
void PrintBox(BoxLink * hbox)
{
int cnt=0;
for(BoxLink *p=hbox;p;p=p->next)
{
printf("第%d个箱子物品编号:",++cnt);
for(GoodsLink *q=p->hg;q;q=q->link)
printf("%5d",q->gno);
printf("\n");
}
}
主函数
int main(void)
{
//生成物品信息
EGoods * g;
g=(EGoods*)malloc(N*sizeof(EGoods));
//物品初始化
for(int i=0;i<N;i++)
{
g[i].gno=i+1;
printf("输入物品号为%d的物品体积:",i+1);
scanf("%d",&g[i].gv);
}
//物品按降序排序
SortD(g);
//装箱
BoxLink * hbox;
hbox=PackingBox(g);
//输出所用箱子信息
PrintBox(hbox);
return 0;
}