c语言装箱问题 贪心算法,贪心算法之装箱问题.cpp

#include

#include

# define V 50

typedef struct{

int gno;

int gv;

}Goods;/*物品信息*/

typedef struct node{

int gno;

struct node *link;

}GNode;/*箱子内物品节点信息*/

typedef struct box{

int restv;

GNode *hg;

struct box* next;

}BNode;/*箱子信息*/

void sortD(Goods *g,int n)

{

int i,j,tag;

Goods temp;

for(i=0;i

tag=0;

for(j=0;j

if(g[j].gv

temp=g[j];

g[j]=g[j+1];

g[j+1]=temp;

tag=1;

}

}

if(tag==0) break;

}

for(i=0;i

printf("%d %d\n",g[i].gno,g[i].gv);

}

}

BNode * PeckBox(Goods *g,int n)

{

BNode *hbox,*tbox,*p;

GNode *q,*newq;

int i,num=0;

hbox=NULL;

for(i=0;i

{//创建物品节点

newq=(GNode*)malloc(sizeof(GNode));

newq->link=NULL;

newq->gno=g[i].gno;

for(p=hbox;p&&(p->restvnext);//跑箱子链

if(!p) //p为空,开新箱子。

{

p=(BNode *)malloc(sizeof(BNode));

p->next=NULL;

p->hg=NULL;

p->restv=V;

if(!hbox){

hbox=tbox=p;

}

else{

tbox=tbox->next=p;

}

num++;

}

//给指针p指向的箱子放物品 (都是在放物品)

p->restv-=g[i].gv;

for(q=p->hg;q&&q->link;q=q->link);

if(q){

q->link=newq;

}

else{

p->hg=newq;

}

}

printf("一共有%d个箱子\n",num);

return hbox;

}

void Print(BNode*hbox)

{

BNode *p;

GNode *q;

int i=0;

for(p=hbox;p;p=p->next){

printf("第%d个箱子里面物品:",++i);

for(q=p->hg;q;q=q->link){

printf("%3d",q->gno);

}

printf("\n");

}

}

void Delete(BNode *hbox)

{

BNode *p;

GNode *q;

while(hbox)

{

p=hbox;

while(p->hg)

{

q=p->hg;

p->hg=q->link;

free(q);

}

hbox=p->next;

free(p);

}

}

int main(void)

{

int i,n,tag,f;

Goods *g;

BNode *hbox=NULL;

printf("装箱问题可以实现的功能有:\n");

printf("1.将物品装入箱子中。\n");

printf("2.输出箱子内的情况。\n");

printf("3.清空箱子\n");

printf("0.结束功能!\n");

scanf("%d",&tag);

f=0;

while(tag){

if(tag==1)

{

printf("请输入物品个数:\n");

scanf("%d",&n);/*输入物品个数*/

g=(Goods *)malloc(n*sizeof(Goods));

printf("请依次输入物品体积\n");

for(i=0;i

g[i].gno=i;

scanf("%d",&g[i].gv);

}

sortD(g,n);//排序

hbox=PeckBox(g,n);//装箱

f=1;

}

if(tag==2&&f)

{

Print(hbox);//输出

}

if(tag==3&&f)

{

free(g);

delete(hbox);

printf("成功删除箱子内的物品!\n");

f=0;

}

else{

if(f==0)

{

printf("请先放入物品!\n");

}

}

scanf("%d",&tag);

}

printf("欢迎在次使用!\n");

return 0;

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值