贪心算法
来源:互联网 发布:网络盒子破解软件 编辑:程序博客网 时间: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;}
阅读全文
1 0
- 【贪心】贪心算法总结
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- 贪心算法
- EM(期望最大化)算法(1):初探原理
- mysql_分组
- opencv3图像灰度化处理 c++
- D
- Windows7下安装与破解IntelliJ IDEA2017
- 贪心算法
- Java设计模式-享元模式
- 源码网站的记录
- python中pandas包中的DataFrame有关操作iloc与.loc的区别
- php 当前日期加一天和指定日期加一天
- HDU 3874 离线处理,树状数组
- mac下tomcat不正常关闭导致端口占用
- 编写第一个Spark程序WordCount
- python入门之初体验-----A Byte of Python3