装箱问题

简介: 装箱问题
/*
 *   装箱问题 
 *   算法:贪婪 
 *   coder:qpz
 *   time:2014-11-23 
 */
#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);
 /*
  第三步:装箱  
  贪心算法 
 */ 
 Gnode *SortGno(Gnode *a,int n);//排序 
  GGnode *Put(int gno);// 物品放入箱子 
 Box *PackingBox(Gnode *a,int n);//处理过程 
 void prinBox(Box *a,Gnode *dic);//输出箱子信息 
 /*
 free
 */
void takeaway(GGnode *);
void closebox(Box *);
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);
    closebox(box);
   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;//箱子头结点地址;
 }
 //输出箱子信息 
 void prinBox(Box *a,Gnode *dic)
 {
   int cnt=0; 
   for(Box *p=a;p;p=p->bnext){
   cout<<"箱子编号:"<<++cnt<<" 箱子剩余空间为:"<<p->ver<<endl;
   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; 
   } 
   cout<<endl;
   }/*end for out*/
   cout<<"共打开"<<cnt<<"个箱子"<<endl; 
 }
 void takeaway(GGnode *a)
 {
   GGnode *q;
   for(q=a;a;q=a){
   a=a->gnext;
   free(q);
   }/*end for*/
 }
void closebox(Box *a)
{
 Box *q;
 for(q=a;a;q=a){
 a=a->bnext;
  takeaway(q->gnext);
  free(q);
 }/*end for*/
}
相关文章
|
1月前
|
算法 安全 Java
非启发式算法——中国剩余定理
非启发式算法——中国剩余定理
64 0
|
1月前
装箱问题(背包问题)
装箱问题(背包问题)
15 0
|
10月前
|
算法
算法提高:计算几何基础 | 详解凸包问题
点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上,或者在其内
109 0
算法提高:计算几何基础 | 详解凸包问题
|
10月前
|
人工智能 算法
算法提高:组合数学| 容斥原理常见应用
容斥原理常见的问题如下。 (1) 篮球、羽毛球、网球三种运动,至少会一种的有22人,会篮球的有15人,会羽毛球的有17人,会网球的有12人,既会篮球又会羽毛球的有11人,既会羽毛球又会网球的有7人,既会篮球又会网球的有9人,那么三种运动都会的有多少人? (2) 《西游记》《三国演义》《红楼梦》三大名著,至少读过其中一本的有20人,读过《西游记》的有10人,读过《三国演义》的有12人,读过《红楼梦》的有15人,读过《西游记》《三国演义》的有8人,读过《三国演义》《红楼梦》的有9人,读过《西游记》《红楼梦》的有7人。问三本书全都读过的有多少人?
109 0
算法提高:组合数学| 容斥原理常见应用
|
9月前
NOIP 装箱问题
NOIP 装箱问题
|
11月前
1295:装箱问题
1295:装箱问题
|
机器学习/深度学习
排列组合、古典概型、几何概型与伯努利概型
排列组合、古典概型、几何概型与伯努利概型
|
机器学习/深度学习 传感器 算法
【装箱问题】基于遗传算法求解三维装箱问题附matlab代码
【装箱问题】基于遗传算法求解三维装箱问题附matlab代码
LDUOJ——山(计算几何+二分+精度)
LDUOJ——山(计算几何+二分+精度)
74 0

热门文章

最新文章