/**
* function:贪心算法
* author:gubojun
* time:2013-1-21
* 装箱问题:设有编号为0,1,···,n-1的n种物品,体积分别为v0,v1,···,vn-1。
将这n种物品装的容量为V的若干箱子里。约定这n种物品的体积均
不超过V,即对于0<=i<n,有0<vi<V。不同的装箱方案所需要的箱
子数目可能不同。装箱问题要求使装尽这n个物品的箱子数要尽量少。
*/
#include <stdio.h>
#include <stdlib.h>
/*物品结构体*/
typedef struct ele{
int vno;//记录物品编号
struct ele *link;
}ELE;
/*箱子结构体*/
typedef struct hnode{
int remainder;//剩下的容积
ELE *head;
struct honde *next;//下一个箱子
}HNODE;
int main(){
//-----------------定义
int i;
int n;//记录物品种数
int box_count;//记录箱子数
int box_volume;//记录箱子的容积
int *a;//记录每种物品的体积
HNODE *box_h;//第一个箱子
HNODE *box_t;//当前的箱子
HNODE *j;
ELE *p,*q;
//-----------------输入数据
printf("输入箱子容积:\n");
scanf("%d",&box_volume);
printf("输入物品种数:\n");
scanf("%d",&n);
//动态分配物品体积存储空间
a=(int *)malloc(sizeof(int)*n);
printf("请按体积从大到小顺序输入各物品的体积:\n");
for(i=0;i<n;i++){
scanf("%d",a+i);
}
box_h=box_t=NULL;
box_count=0;//初始化箱子数目计数器
//开始
for(i=0;i<n;i++){
//申请一个物品结构体的空间
p=(ELE *)malloc(sizeof(ELE));
p->vno=i;//更新物品编号
for(j=box_h;j!=NULL;j=j->next){
if(j->remainder>=a[i]) break;
}
if(j==NULL){//如果箱子不存在
//申请一个箱子结构体的空间
j=(HNODE *)malloc(sizeof(HNODE));
//更新箱子剩余空间
j->remainder=box_volume-a[i];
j->head=NULL;
if(box_h==NULL){//如果第一个箱子不存在
box_h=box_t=j;
}
else{//有箱子存在
box_t->next=j;//当前的箱子连接上新申请的箱子
box_t=box_t->next;//更新当前的箱子为新申请的箱子
}
j->next=NULL;//箱子的next值为空
box_count++;//箱子计数器加1
}
else j->remainder-=a[i];//更新箱子剩余容积
for(q=j->head;q!=NULL&&q->link!=NULL;q=q->link);
if(q==NULL){
p->link=j->head;//头插法,将物品放入箱子中
j->head=p;
}
else{
p->link=NULL;
q->link=p;
}
}
printf("共使用了%d只箱子",box_count);
printf("各箱子装物品情况如下:\n");
for(j=box_h,i=1;j!=NULL;j=j->next,i++){
printf("第%2d只箱子,还剩下余容积%4d,所装物品有\n",i,j->remainder);
for(p=j->head;p!=NULL;p=p->link)
printf("%d(%d) ",p->vno+1,a[p->vno]);
printf("\n");
}
}
箱子问题(贪心)
最新推荐文章于 2021-02-07 16:40:54 发布