箱子问题(贪心)

/**
 * function:贪心算法
 * author:gubojun
 * time:2013-1-21
 * 装箱问题:设有编号为0,1,···,n-1的n种物品,体积分别为v0,v1,···,vn-1。
             将这n种物品装的容量为V的若干箱子里。约定这n种物品的体积均
             不超过V,即对于0<=i<n,有0<vi<V。不同的装箱方案所需要的箱
             子数目可能不同。装箱问题要求使装尽这n个物品的箱子数要尽量少。
 */

#include <stdio.h>
#include <stdlib.h>
/*物品结构体*/
typedef struct ele{
    int vno;//记录物品编号
    struct ele *link;
}ELE;
/*箱子结构体*/
typedef struct hnode{
    int remainder;//剩下的容积
    ELE *head;
    struct honde *next;//下一个箱子
}HNODE;
int main(){
    //-----------------定义
    int i;
    int n;//记录物品种数
    int box_count;//记录箱子数
    int box_volume;//记录箱子的容积
    int *a;//记录每种物品的体积
    HNODE *box_h;//第一个箱子
    HNODE *box_t;//当前的箱子
    HNODE *j;
    ELE *p,*q;
    //-----------------输入数据
    printf("输入箱子容积:\n");
    scanf("%d",&box_volume);
    printf("输入物品种数:\n");
    scanf("%d",&n);
    //动态分配物品体积存储空间
    a=(int *)malloc(sizeof(int)*n);
    printf("请按体积从大到小顺序输入各物品的体积:\n");
    for(i=0;i<n;i++){
        scanf("%d",a+i);
    }
    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->next=j;//当前的箱子连接上新申请的箱子
                box_t=box_t->next;//更新当前的箱子为新申请的箱子
            }
            j->next=NULL;//箱子的next值为空
            box_count++;//箱子计数器加1
        }
        else j->remainder-=a[i];//更新箱子剩余容积

        for(q=j->head;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("各箱子装物品情况如下:\n");
    for(j=box_h,i=1;j!=NULL;j=j->next,i++){
        printf("第%2d只箱子,还剩下余容积%4d,所装物品有\n",i,j->remainder);
        for(p=j->head;p!=NULL;p=p->link)
            printf("%d(%d)  ",p->vno+1,a[p->vno]);
        printf("\n");
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值