装箱问题改进

/*

 *   装箱问题 

 *   算法:贪婪 

 *   coder:瞿鹏志 

 *   time2014-11-29

 */

#include <stdlib.h> 

#include <iostream>

using namespace std;

#define MAX  20

/*

第一步:创建物品字典 

*/ 

typedef struct {

int gno;//编号

int ver;//占用空间 

}Gnode;

Gnode *bh(int n); 

void prinGnode(Gnode *a,int n);

/*

 第二步:创建箱子 

 */

 //1.箱子里所装的物品 

typedef struct gnode{

int gno;//编号

    struct gnode *gnext;//指向物品 

}GGnode; 

//2.箱子

typedef struct box{

int ver;//箱子体积 

GGnode *gnext;//指向箱中物品 

struct box *bnext;//指向下一个箱子 

}Box; 

//打开新箱子 

Box *OpenBox(void);

//创建物品结点 

GGnode *GreatLink(int gno);

 /*

  第三步:装箱  

  贪心算法 

 */ 

 Gnode *SortGno(Gnode *a,int n);//排序 

  GGnode *Put(int gno);// 物品放入箱子 

 Box *PackingBox(Gnode *a,int n);//处理过程 

 void prinBoxG(Box *p,Gnode  *dic);//输出箱子中物品的信息 

 void prinBox(Box *a,Gnode *dic);//输出箱子信息 

int main(void)

{

Gnode *a,*b;

Box *box;

int n=0;

cout<<"请输入物品个数:";

cin>>n;

if(n){

a=bh(n); 

cout<<"排序前"; 

prinGnode(a,n);

b=SortGno(a,n);

cout<<"排序后";

prinGnode(b,n);

box=PackingBox(b,n);

     prinBox(box,a);

     free(a);

     free(b);

}else{

cout<<"没有物品,不用打开箱子"<<endl;

}

 

return 0;

}

//创建物品字典 

Gnode *bh(int n) 

{

 

Gnode *a=(Gnode *)malloc(n*sizeof(Gnode));

for(int i=0;i<n;i++){

a[i].gno=i+1; 

cout<<"请输入第"<<a[i].gno<<"个物品的体积"; 

cin>>a[i].ver;

} /*end for*/

cout<<"物品数据库创建成功!!!"<<endl;

cout<<endl; 

return a;

//输出物品字典 

void prinGnode(Gnode *a,int n)

{

cout<<"物品表输出:"<<endl; 

for(int i=0;i<n;i++){

cout<<"编号:"<< a[i].gno<<","<<"体积:"<<a[i].ver<<endl;

}/*end for*/

cout<<endl;

//排序

 Gnode *SortGno(Gnode *a,int n)

 {

  Gnode *b=(Gnode *)malloc(n*sizeof(Gnode));

  Gnode t;

  for(int i = 0;i < n; i++){

        b[i]=a[i];

  }/*end for*/

    for(int i=0;i<n;i++){

     int max;

     for(int j=max=i;j<n;j++){

     if(b[j].ver>b[max].ver){

     max=j;

     }/*end if*/

     }/*end for2*/

         t=b[i];

     b[i]=b[max];

     b[max]=t;

    }/*end for1*/

  return b;

 } 

//打开新箱子

Box *OpenBox(void)

{

Box *head;

head=(Box *)malloc(sizeof(Box));

  head->ver=MAX;

  head->gnext=NULL;

head->bnext=NULL; 

 return head;

//放入物品

GGnode *Put(int gno)

    GGnode *gp=(GGnode *)malloc(sizeof(GGnode));

  gp->gno=gno; 

  gp->gnext=NULL;

  return gp;

/*

//装箱 

Box *PackingBox(Gnode *a,int n)

 {

  Box *head,*p,*qb;

  GGnode *gp,*qg;

    head=p=OpenBox();

    for(int i = 0;i < n; i++){

      //是否超过箱子最大容量 是 箱子装不下  输出编号 continue 

      if(a[i].ver > MAX){

       cout<<"编号为"<<a[i].gno<<"的物品体积过大"<<endl;

       continue; 

      }/*end if*/

 /*       qb=p;

    //判断已开箱子可否存入

while(p&&(a[i].ver > p->ver)){

qb=p;

                p=p->bnext;

} //while

//没有已开箱子可以装下物品

           if(!p){

               //1.开新箱子

               qb->bnext=p=OpenBox();

           } /*end if*/

               //装箱   

               //1.修改箱子容量 

  /*    p->ver-=a[i].ver;

      //2.放入物品

             for(qg=gp=p->gnext;gp;qg=gp,gp=gp->gnext);

            if(!qg)

    p->gnext=Put(a[i].gno);

    else

    qg->gnext=Put(a[i].gno);

}/*end for 遍历物品*/

/* if(head->ver == MAX){

head=NULL;

}

  return head;//箱子头结点地址;

 }*/

GGnode *GreatLink(int gno)

 {

 

  GGnode *g=(GGnode *)malloc(sizeof(GGnode)); 

  g->gno=gno;

  g->gnext=NULL;

  return g;

 }

//装箱 

Box *PackingBox(Gnode *a,int n)

 {

  Box *head=NULL,*p,*tb;

  GGnode *gp,*qg,*newg;

    for(int i = 0;i < n; i++){

      //跑箱子

 for(p=head;p&&(p->ver<a[i].ver);p=p->bnext);

 if(!p){

   //是否超过箱子最大容量 是 箱子装不下  输出编号 

      if(a[i].ver > MAX){

       cout<<"编号为"<<a[i].gno<<"的物品体积过大"<<endl;

        continue;

      }/*end if*/

         //1.开新箱子

         p=OpenBox();

 

       if(!head){

          head=tb=p;

       }

        else{

      cout<<1<<p;

      //挂链 

 tb->bnext=p; 

        cout<<2;

        tb=tb->bnext;

        cout<<3;      

 }/*if(!p)*/

       }         

               //装箱   

               //1.修改箱子剩余容量

              p->ver-=a[i].ver;

      //2.放入物品

      newg=GreatLink(a[i].gno);

      for(qg=p->gnext;qg&&qg->gnext;qg=qg->gnext);

         if(!qg){

       p->gnext=newg;

       }else{

       qg->gnext=newg;

       }

 

}/*end for 遍历物品*/

  return head;//箱子头结点地址;

 }

 //输出箱子中物品的信息 

 void prinBoxG(Box *p,Gnode  *dic)

 {

    if(p->gnext){

  cout<<"箱子中物品有:"<<endl;

  for(GGnode *gp=p->gnext;gp;gp=gp->gnext){

  cout<<"物品编号"<<gp->gno<<" 物品体积:"<<dic[gp->gno-1].ver<<endl;

  }/*end for in*/

  }else{

  cout<<"箱子中没有物品"<<endl; 

 

 } 

 

 //输出箱子信息 

 void prinBox(Box *a,Gnode *dic)

 {

  int cnt=0; 

  for(Box *p=a;p;p=p->bnext){

  cout<<"箱子编号:"<<++cnt<<" 箱子剩余空间为:"<<p->ver<<endl;

     prinBoxG(p,dic);

  cout<<endl;

  }/*end for out*/

  cout<<"共打开"<<cnt<<"个箱子"<<endl; 

 

 }

 

 

 

原文地址:https://www.cnblogs.com/pzqu/p/9457671.html