c语言经典算法设计方法 联系客服

发布时间 : 星期四 文章c语言经典算法设计方法更新完毕开始阅读57fff9ad66ec102de2bd960590c69ec3d4bbdb6d

上述算法能求出需要的箱子数box_count,并能求出各箱子所装物品。下面的例子说明该算法不一定能找到最优解,设有6种物品,它们的体积分别为:60、45、35、20、20和20单位体积,箱子的容积为100个单位体积。按上述算法计算,需三只箱子,各箱子所装物品分别为:第一只箱子装物品1、3;第二只箱子装物品2、4、5;第三只箱子装物品6。而最优解为两只箱子,分别装物品1、4、5和2、3、6。

若每只箱子所装物品用链表来表示,链表首结点指针存于一个结构中,结构记录尚剩余的空间量和该箱子所装物品链表的首指针。另将全部箱子的信息也构成链表。以下是按以上算法编写的程序。

【程序】

#include stdio.h

#include stdlib.h typedef struct ele {

int vno;

struct ele*link; }ELE;

typedef struct hnode {

int remainder; ELE*head;

struct hnode*next; }HNODE;

void main() {

int n,i,box_count,box_volume,*a; HNODE*box_h,*box_t,*j; ELE*p,*q;

Printf(\输入箱子容积\\n\; Scanf(\; Printf(\输入物品种数\\n\; Scanf(\;

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

printf(\请按体积从大到小顺序输入各物品的体积:\; for(i=0;i n;i++) scanf(\; box_h=box_t=NULL; box_count=0; for(i=0;i n;i++) {

p=(ELE*)malloc(sizeof(ELE)); p-vno=i;

for(j=box_h;j!=NULL;j=j-next) if(j-remainder=a[i]) break; if(j==NULL) {

j=(HNODE*)malloc(sizeof(HNODE)); j-remainder=box_volume-a[i]; j-head=NULL; if(box_h==NULL) box_h=box_t=j;

else box_t=box_t-next=j; j-next=NULL; box_count++; }

else j-remainder-=a[i];

for(q=j-next;q!=NULL&&q-link!=NULL;q=q-link); if(q==NULL) {

p-link=j-head;

j-head=p; } else {

p-link=NULL; q-link=p; } }

printf(\共使用了%d只箱子\,box_count); printf(\各箱子装物品情况如下:\; for(j=box_h,i=1;j!=NULL;j=j-next,i++) {

printf(\第-只箱子,还剩余容积M,所装物品有;\\n\; for(p=j-head;p!=NULL;p=p-link) printf(\; printf(\; } } }