箱子问题(贪心)

来源:互联网 发布: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");    }}

原创粉丝点击