装箱问题的简单实现

来源:互联网 发布:汽车网络推广 编辑:程序博客网 时间:2024/06/05 08:44
//装箱问题的简单实现
#include <iostream>#include <stdlib.h>#include <time.h>using namespace std;typedef struct{int gno;int gv;}Goods;class GNode{private:int gno;GNode * link = NULL;public:GNode(int gno){this->gno = gno;}~GNode(void){}int &Getgno(){return gno;}GNode* &Getlink(){return link;}};class GBox{private:int gv = 10;GNode *gh = NULL;GBox *next = NULL;public:GBox(void){}~GBox(void){}int &Getgv(){return gv;}GNode* &Getgh(){return gh;}GBox* &Getnext(){return next;}};class Realize{private:GBox *ghead = NULL;Goods *goods = NULL;int n;public:Realize(int value):n(value){}~Realize(){}void goodsinit(void);void PackingBox(); void PrintTable();void PrintResult();void dofun(void);};void Realize::goodsinit(void){srand((unsigned)time(NULL));goods = new Goods[n]();for(int i=0;i<n;i++){goods[i].gno = i+1;goods[i].gv = rand()%10+1;}for(int i=0;i<n-1;i++)for(int j=i+1;j<n;j++){Goods t;if(goods[i].gv < goods[j].gv){t = goods[i];goods[i] = goods[j];goods[j] = t;}}} void Realize::PrintTable(){for(int i=0;i<n;i++){cout<<"NO."<<goods[i].gno<<":"<<goods[i].gv<<endl;}}void Realize::PackingBox(){GNode *j;GBox *p,*t = NULL;for(int i=0;i<n;i++){j = new GNode(goods[i].gno);p = ghead;//找到第一个可以放的箱子或者是新开一个箱子 while(p && p->Getgv() < goods[i].gv){p = p->Getnext();} if(!p){//p为空,开新箱子  if(!t){//头结点    p = ghead = t = new GBox(); } else{ p = t = t->Getnext() = new GBox(); }}//p可以被放在当前位置if(!p->Getgh()){//箱子里无物品 p->Getgh() = j;}else{GNode *k = p->Getgh();while(k->Getlink())k = k->Getlink();k->Getlink() = j;}p->Getgv() -= goods[i].gv;}}void Realize::PrintResult(void){GBox *p;GNode *q;int i = 1;for(p = ghead;p;p = p->Getnext()){cout<<"第"<<i++<<"个箱子:"<<endl;for(q = p->Getgh();q;q = q->Getlink()){cout<<"NO."<<q->Getgno()<<"    ";}cout<<"剩余空间:"<<p->Getgv()<<endl;}}void Realize::dofun(void){goodsinit();PrintTable();cout<<"物品清单排序完毕!"<<endl;PackingBox();cout<<"装箱完毕!"<<endl;PrintResult();cout<<"输出结果完毕!"<<endl; }int main(void){Realize* r = new Realize(20);r->dofun();return 0;} 

0 0