zoukankan      html  css  js  c++  java
  • 装箱问题改进

    /*

     *   装箱问题 

     *   算法:贪婪 

     *   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; 

     

     }

     

     

     

  • 相关阅读:
    junit单元测试踩过的坑
    Arrays.asList()需要注意的点
    oracle数据库学习笔记
    实训笔记
    spring事务学习笔记
    java锁
    jvm内存模型
    iOS 应用架构 (三)
    iOS 应用架构 (二)
    iOS 应用架构 (一)
  • 原文地址:https://www.cnblogs.com/pzqu/p/9457671.html
Copyright © 2011-2022 走看看