贪心算法

正所谓人人都有贪心,C语言算法上的贪心可不是实际意义上的贪心,C语言结构上的贪 心可以说满足两个条件:贪心选择性质和最优子结构性质。满足这两个条件的话就可以尝试用贪心算法解决问题。

贪心选择性质是指原问题的整体最优解可以通过一系列局部最优的选择得到。

应用同一规则,将原问题变为一个相似的但规模更小的子问题,而后的每一步都是当前最佳的选择。这种选择依赖于已做出的选择,但不依赖于未做出的选择。运用贪心策略解决的问题在程序的运行过程中无回溯过程。

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题是否可用贪心算法求解的关键。例如原问题S={a1,

a2,…,ai,…, an},通过贪心选择选出一个当前最优解{ai}之后,转化为求解子问题

S-{ai},如果原问题的最优解包含子问题的最优解,则说明该问题满足最优子结构性质,

算法步骤

1、 选择算法结构

就是说你必须要选择一个贪心的方案,就好比如你去买菜,什么菜最好,什么菜买了才不会吃亏(这又关于另一个问题,物品的价值,越高越好)。当然啦,你愿意当个大傻个让别人扎一刀,那也无所谓的。

2、 局部最优解

这里说的呢就是实战的过程最优解,就好比如你要买一袋苹果,一般来说肯定拿最大的先(这里就是一个局部最优解),接着就是摊主上第二大的苹果,以此类推,最终的出的结果就是贪心的后果咯。

3、 算法实战

1、船装载问题

有一条船的装载量一定,要求装载的物品的数量尽可能多, 而船的容量是固定的, 那么优先把重量小的物品放进去,

在容量固定的情况下,装的物品最多。采用重量最轻者先装的贪心选择策略,从局部最优达到全局最优,从而产生最优装载问题的最优解。 (

1)当载重量为定值 c 时, wi 越小时,可装载的古董数量 n 越大。只要依次选择最小重量古董,直到不能再装为止。 ( 2)把 n

个古董的重量从小到大(非递减)排序,然后根据贪心策略尽可能多地选出前i 个古董,直到不能继续装为止,此时达到最优。

源代码

#include

#include

const int N = 1000005;

using namespace std;

double w[N]; //古董的重量数组

int main()

{

double c;

int n;

cout<

cin>>c>>n;

cout<

for(int i=0;i

{

cin>>w[i]; //输入每个物品重量

}

sort(w,w+n); //按古董重量升序排序

double temp=0.0;

int ans=0; // tmp 为已装载到船上的古董重量, ans 为已装载的古董个数

for(int i=0;i

{

tmp+=w[i];

if(tmp<=c)

ans ++;

else

break;

}

cout<

cout<

return 0;

}

2、背包问题

山洞中有 n 种宝物,每种宝物有一定重量 w 和相应的价值 v,毛驴运载能力有限, 只能运走 m

重量的宝物,一种宝物只能拿一样,宝物可以分割。那么怎么才能使毛驴运走宝物的价值最大呢 (

1)每次挑选价值最大的宝物装入背包,得到的结果是否最优? ( 2)每次挑选重量最小的宝物装入,能否得到最优解? (

3)每次选取单位重量价值最大的宝物,能否使价值最高? 未了满足我们人的小小贪心,就是选择第三种啦。性价比最高,所得到的的最后总价值最大。

源代码

#include

#include

using namespace std;

const int M=1000005;

struct three{

double w;//每个宝物的重量

double v;//每个宝物的价值

double p;//性价比

}s[M];

bool cmp(three a,three b)

{

return a.p>b.p;//根据宝物的单位价值从大到小排序

}

int main()

{

int n;//n 表示有 n 个宝物

double m ;//m 表示毛驴的承载能力

cout<

cin>>n>>m;

cout<

for(int i=0;i

{

cin>>s[i].w>>s[i].v;

s[i].p=s[i].v/s[i].w;//每个宝物单位价值

}

sort(s,s+n,cmp);

double sum=0.0;// sum 表示贪心记录运走宝物的价值之和

for(int i=0;i

{

if( m>s[i].w )//如果宝物的重量小于毛驴剩下的承载能力

{

m-=s[i].w;

sum+=s[i].v;

}

else//如果宝物的重量大于毛驴剩下的承载能力

{

sum+=m*s[i].p;//部分装入

break;

}

}

cout<

return 0;

}

4、 会议安排问题

会议安排的目的是能在有限的时间内召开更多的会议(任何两个会议不能同时进行)。在会议安排中,每个会议 i 都有起始时间 bi 和结束时间

ei,且 biej)均在“有限的时间内”,且不相交,则称会议 i 与会议 j 相容的。也就是说,当 bi≥ej 或 bj≥ei 时,会议 i与会议 j

相容。会议安排问题要求在所给的会议集合中选出最大的相容活动子集,即尽可能在有限的时间内召开更多的会议。总的来说就是了解各个会议的开始时间和结束时间,按照时间安排,使会议能举办的最多。

会议时间表 会议 i 1 2 3 4 5 6 7 8 9 10 开始时间 bi 8 9 10 11 13

14 15 17 18 16 结束时间 ei 10 11 15 14 16 17 17 18 20 19 (

1)每次从剩下未安排的会议中选择会议具有最早开始时间且与已安排的会议相容的会 议安排,以增大时间资源的利用率。 (

2)每次从剩下未安排的会议中选择持续时间最短且与已安排的会议相容的会议安排, 这样可以安排更多一些的会议。 (

3)每次从剩下未安排的会议中选择具有最早结束时间且与已安排的会议相容的会议安排,这样可以尽快安排下一个会议。

源代码

#include

#include

#include

using namespace std;

struct Meet

{

int beg; //会议的开始时间

int end; //会议的结束时间

int num; //记录会议的编号

}meet[1000]; //会议的最大个数为 1000

class setMeet{

public:

void init();

void solve();

private:

int n,ans; // n:会议总数 ans: 最大的安排会议总数

};

//读入数据

void setMeet::init()

{

int s,e;

cout <

cin >> n;

int i;

cout <

for(i=0;i

{

cin>>s>>e;

meet[i].beg=s;

meet[i].end=e;

meet[i].num=i+1;

}

}

bool cmp(Meet x,Meet y)

{

if (x.end == y.end)

return x.beg > y.beg;

return x.end < y.end;

}

void setMeet::solve()

{

sort(meet,meet+n,cmp); //对会议按结束时间排序

cout <

int i;

cout <

for(i=0; i

{

cout<< " " << meet[i].num<

}

cout <

cout << "选择的会议的过程: " <

cout <

ans=1;

int last = meet[0].end; //记录刚刚被选中会议的结束时间

for( i = 1;i < n;++i)

{

if(meet[i].beg>=last)

{ //如果会议 i 开始时间大于等于最后一个选中的会议的结束时间

ans++;

last = meet[i].end;

cout <

}

}

cout <

}

int main()

{

setMeet sm;

sm.init();//读入数据

sm.solve();//贪心算法求解

return 0;

}

c语言背包问题贪心算法,C/C++语言算法篇(一):贪心算法相关推荐

  1. C语言背包问题的算法(附完整源码)

    C语言背包问题的算法 背包问题引出 C语言背包问题的算法完整源码(定义,实现,main函数测试) 背包问题引出 想象你是一个小偷,你想从房间里偷东西. 您有一个可以处理最大重量W的背包,并且您想把它装 ...

  2. 算法经典“钓鱼”问题详解 基于贪心算法 C语言描述

    算法经典"钓鱼"问题详解 基于贪心算法 初始条件 在一条水平路边,有 n 2 ≤ n ≤ 25个钓鱼池,从左到右编号为1.2.3.--.n.小明有H1 ≤ H ≤ 16个小时的空余 ...

  3. 数据结构与算法(C语言)

    第一章: 数据结构绪论 1.什么是程序:程序 = 数据结构 + 算法 2.逻辑结构&物理结构的区别用法 基本的目标就是将数据及其逻辑关系存储到计算机的内存中 一:逻辑结构: 逻辑结构是指数据对 ...

  4. Dijkstra(迪杰斯特拉)算法(C语言)

    今天学了下数据结构,最近国旗班最后一周训练着实使我没什么时间写博客,这也算是挤出点时间把迪杰斯特拉算法好好整了整,我尽量把这个清晰的写出来.这里也参考大佬的代码让我对程序大体有了思路,也算是站在巨人的 ...

  5. 十种经典排序算法精粹(c语言版本)

    下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序.整理出来以作备 ...

  6. 迪杰斯特拉算法(C语言实现)

    迪杰斯特拉算法(C语言实现) 如上图,求以a为源点到个顶点的最短路劲. #include "stdio.h" #include "stdlib.h" //用一个 ...

  7. 【每日算法】C语言8大经典排序算法(2)

    接上文--->[每日算法]C语言8大经典排序算法(1) 二.插入类排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中 ...

  8. 简单算法的举例c语言,计算机科学与技术系C语言程序设计22简单算法举例.PPT

    计算机科学与技术系C语言程序设计22简单算法举例 第2章 程序的灵魂--算法 本章主要介绍算法的思想及算法的表示方法. 2.0 绪论 2.1 算法的概念 2.2 简单算法举例 2.3 算法的特性 2. ...

  9. python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt

    数据结构与算法:Python语言描述 栈和队列 迷宫问题 迷宫问题的特点: 存在一集可能位置,一些位置相互连通,一步可达 一个位置可能连通若干位置,出现向前探查的多种可能(有分支) 目标是找到一条路径 ...

  10. 【算法+图像处理】2D卷积与快速卷积算法C语言实现

    卷积算法在图像处理中有着广泛的应用,通常使用的去噪算法.边缘增强算法等的实现都使用到了2D卷积算法.这里介绍一下2D卷积算法和快速卷积算法的C语言实现. 卷积定义 即 步骤: 1)滑动核,使其中心位于 ...

最新文章

  1. python计算两个向量之间的欧氏距离
  2. 中南大学计算机复试题,中南大学计算机05年复试试题
  3. 10进制与16进制之间的转换 delphi
  4. 可怕又可笑的看病经历
  5. 直播丨BMMeetup第2期:大模型计算加速技术,2场特邀和7位青年学者技术报告联袂上演...
  6. java recv failed,jmeter压测报错Unrecognized Windows Sockets error: 0: recv failed
  7. Maven下Flex国际化配置
  8. mysql中int型的zerofill参数
  9. 糖果浏览器和139邮箱巧妙应用:将网页文字一键发送到手机上
  10. MySQL 8.0开始Group by不再排序
  11. x什么意思c语言新闻app啊我et,C语言笔试题目
  12. es6 Proxy.revocable()方法
  13. Android 应用开发(43)---开关按钮ToggleButton和开关Switch
  14. Android SDK Manager配置
  15. matlab日期时间函数汇总
  16. javascript 读写服务器文件,js读写文件 - 爱coding的个人页面 - OSCHINA - 中文开源技术交流社区...
  17. yolov5+deepsort车辆跟踪、计数、测速、碰撞检测、违规驶入检测(课程设计)
  18. 聊点不一样的,初级软件测试岗需要做些什么?
  19. 苹果Apple TV+上线了重磅史诗级别科幻作品,这是要挑战Netflix、HBO?
  20. 如何免ROOT,实现安卓设备远程控制?

热门文章

  1. JavaScript中实现首字母大写,小写
  2. 安装Broadcom 43xx 无线网卡驱动
  3. R语言相关性分析函数和相关性检验函数
  4. android html换行,在html中控制自动换行
  5. c语言和python的区别
  6. Ubuntu下的Docker安装
  7. 【jzoj4637】【大鱼海棠】
  8. 5分钟成为车联网专家|标准+实践双管齐下,车联网发展还看中国
  9. 蒙特卡洛算法的MATLAB实现
  10. kswapd0病毒查杀过程