贪心算法

本文介绍了一种使用贪心算法解决装箱问题的方法,通过将物品按体积降序排列并依次放入箱子来减少使用的箱子数量。文章提供了详细的算法步骤及C语言实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

贪心准则:
①将一个问题的n步的每一步抽象出公共的最优解
②一个问题只有一个贪心准则,问题在求解时贪心准则不许改变。
☆特点:不一定产生最优解,但,简单,快速。


装箱问题

问题描述:
①有n个物品,体积V1,V2,V3…Vn
②有若干个体积为V的箱子。
要求:将n个物品全部装入箱子中,打开的箱子尽量少。


贪心准则:
①降所有物品按体积按降序排列
②按开箱顺序遍历已打开的箱子,将每一个武平装入打开较早的箱子


算法描述:
这里写图片描述

这里写图片描述


代码实现:

头文件

#include<stdio.h>
#include<stdlib.h>
#define N 8 //物品数目
#define V 10 //箱子体积

创建结构体

//物品信息
/*用typedef重命名或其数据不需
要结构体名时结构体名可省略*/
typedef struct{
    int gno;//编号
    int gv;//体积
}EGoods;

//装入箱子中物品编号结点
typedef struct goods{
    int gno;//编号
    struct goods *link;//后继结点
}GoodsLink;

//箱子信息结点
typedef struct box{
    int restV;//箱子剩余体积
    GoodsLink * hg;//所装入的物品
    struct box * next;
}BoxLink;

物品按降序排序函数

//物品按降序排序
void SortD(EGoods *g)
{
    EGoods t;
    for(int i=0;i<N-1;i++)
        for(int j=N-1;j>i;j--)
        {
            if(g[j].gv > g[j-1].gv)
            {
                t=g[j];
                g[j]=g[j-1];
                g[j-1]=t;
            }
        }
}

装箱函数

//装箱
BoxLink * PackingBox(EGoods *g)
{
    BoxLink *hbox=NULL,*tbox,*pbox;//hbox为箱子的头结点,tbox为箱子的尾结点
    GoodsLink *p,*q;
    for(int i=0;i<N;i++)
    {
        //遍历所有箱子
        for(pbox=hbox;pbox && pbox->restV < g[i].gv;pbox=pbox->next);
        if(!pbox)//若没有箱子可以装下g[i]
        {
            //创建箱子结点
            pbox=(BoxLink *)malloc(sizeof(BoxLink));
            pbox->hg=NULL;
            pbox->restV=V;
            pbox->next=NULL;
            if(!hbox)//如果无任何箱子
                hbox=tbox=pbox;
            else
                tbox=tbox->next=pbox;
        }
        //创建所装入的物品结点
        q=(GoodsLink*)malloc(sizeof(GoodsLink));
        q->gno=g[i].gno;
        q->link=NULL;
        //装入,遍历该箱子所有物品结点
        for(p=pbox->hg;p && p->link;p=p->link);
        if(!p)
            pbox->hg=q;
        else
            p->link=q;
        pbox->restV-=g[i].gv;

    }
    return hbox;
}   

输出所用箱子信息函数

//输出所用箱子信息
void PrintBox(BoxLink * hbox)
{
    int cnt=0;
    for(BoxLink *p=hbox;p;p=p->next)
    {
        printf("第%d个箱子物品编号:",++cnt);
        for(GoodsLink *q=p->hg;q;q=q->link)
            printf("%5d",q->gno);
        printf("\n");
    }
}

主函数

int main(void)
{
    //生成物品信息
    EGoods * g;
    g=(EGoods*)malloc(N*sizeof(EGoods));
    //物品初始化
    for(int i=0;i<N;i++)
    {
        g[i].gno=i+1;
        printf("输入物品号为%d的物品体积:",i+1);
        scanf("%d",&g[i].gv);
    }
    //物品按降序排序
    SortD(g);

    //装箱
    BoxLink * hbox;
    hbox=PackingBox(g);

    //输出所用箱子信息
    PrintBox(hbox);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值