箱子问题(贪心)
来源:互联网 发布:java stringbuffer反转 编辑:程序博客网 时间:2024/04/24 09:19
/** * 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"); }}