贪婪算法-----装箱问题

1.贪婪准则:
(1)贪婪准则设计算法过程的每一步的最优解(局部最优)
(2)贪婪准则一旦设好,中途不变
2.贪婪准则并不一定可以得到最优解。

装箱问题:
问题描述:有若干个体积为v的箱子,若有n个物品:v0,v1,v2…vn
要求:将所有物品都装入箱子中,使打开的箱子尽可能少
贪心准则:将所有物品按体积降序排列
每次取出一个物品(当前未装入箱子中体积最大的)
遍历所有已打开的箱子,将该物品放入一个较早打开的箱子
存储:采用单向链表存储
类型说明:
(1)物品信息:typedef struct{
int gno;//物品编号
int gv;//物品体积
}ElemG;
(2)物品结点:typedef struct node{
int gno;
struct node *link;
}GoodsLink;
(3)箱子结点:typedef struct box{
int Remainder;//体积
GoodsLink *hg;
struct box *next;
}BoxLink;

#include<stdio.h>
#include<stdlib.h>
#define V 10

typedef struct{
	int gno;//物品结点
	int gv;//物品体积 
}ElemG;//物品信息

typedef struct node{
	int gno;//物品编号 
	struct node *link;
}GoodsLink;//物品结点信息

typedef struct box{
	int remainder;//箱子的体积 
	GoodsLink *hg;//指向物品结点 
	struct box *next;//指向下一个箱子结点 
}BoxLink;

void SortD(ElemG *g,int n)
{
	ElemG t;
	int i,j;
	for(i=0;i<n-1;i++){//冒泡排序 
		for(j=i+1;j<n;j++){
			if(g[i].gv<g[j].gv){
				t=g[i];
				g[i]=g[j];
				g[j]=t;
			}
		}
	}
} 

BoxLink *Packing(ElemG *g,int n)
{
	BoxLink *hbox,*tail,*p;
	GoodsLink *q,*newg;
	hbox=NULL;
	for(int i=0;i<n;i++){
		for(p=hbox;p&&p->remainder<g[i].gv;p=p->next);//循环遍历箱子链,找出要放的箱子或者判断开不开新箱子
		if(!p){//没有已打开的箱子可放 创建新箱子 
			p=(BoxLink *)malloc(sizeof(BoxLink));
			p->remainder=V;//赋上新箱子体积 
			p->hg=NULL; 
			p->next=NULL;//箱子结点指针域和物品结点指针域赋空 
			if(!hbox){//第一个要开的箱子 
				hbox=tail=p;
			}
			else{//其他箱子,挂链 
				tail=tail->next=p;
			}
		}
		p->remainder-=g[i].gv;//放入物品,箱子体积减少 
		newg=(GoodsLink *)malloc(sizeof(GoodsLink));//创建物品结点 
		newg->gno=g[i].gno;//物品结点编号 即物品编号 
		newg->link=NULL;//物品结点指针域赋空 
		for(q=p->hg;q&&q->link;q=q->link);//遍历物品结点链,找到要挂的地方 
		if(!q){//物品链还没有物品 
			p->hg=newg;
		}
		else{//物品链有结点,遍历到尾结点,挂链 
			q->link=newg;
		}
	}
	return hbox; 
}

void PrintBox(BoxLink *h)
{
	int i=0;
	BoxLink *p;
	GoodsLink *q;
	for(p=h;p;p=p->next){//遍历箱子链 
		printf("第%d个箱子:",++i);
		for(q=p->hg;q;q=q->link){//输出当前箱子结点中的物品链各物品编号 
			printf("有第%d个物品、",q->gno);
		}
		printf("\n");
	}
}

int main()
{
	ElemG *g;
	BoxLink *hbox;
	int n;//物品个数
	//初始化物品信息
	printf("请输入物品数:");
	scanf("%d",&n);
	g=(ElemG *)malloc(n*sizeof(ElemG));
	printf("请输入各物品体积:");
	for(int i=0;i<n;i++){
		g[i].gno=i+1;
		scanf("%d",&g[i].gv);
	} 
	//排序
	SortD(g,n);
	//装箱
	hbox=Packing(g,n);
	//输出
	PrintBox(hbox);
	return 0; 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值