贪心算法

来源:互联网 发布:网络盒子破解软件 编辑:程序博客网 时间:2024/05/20 19:46

贪心准则:
①将一个问题的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;}
原创粉丝点击