前言

关于贪心算法,我在这篇博客中已经做了简单的介绍。初识贪心算法

下面来介绍一下贪心算法中的一个经典的问题——背包问题

一、问题描述

一天,阿里巴巴赶着一头毛驴上山砍柴,无意间在远处发现了一群盗贼,他们把偷窃强盗来的宝物全部藏在一个山洞里,山洞前有一个洞门,只见盗贼首领说了一句“芝麻开门”,顷刻间,洞门大开,里面漏出了阿里巴巴这辈子都没有见过的稀世珍宝。阿里巴巴心想:这些盗贼真的可恨,囤积了这么多盗来的宝物藏匿于此,等他们走掉后,不如偷偷把一部风宝物偷出来分给村里的穷人们,让他们开开眼界,他打算一种宝物只拿一个,如果太重就用锤子锤开分解装走一部分,但是毛驴的运载能力有限,怎样才能用自己的驴子运走最大价值的财宝分给那些穷人们呢?

二、问题分析

简而言之,假设山洞中一共有n种宝物,每一种宝物都有一定的重量w与价值v,毛驴的最大运载能力为m,一种宝物只能拿走一样,且宝物可以分割带走。那么怎样才能使毛驴运走的宝物价值最大呢?

这是一个典型的贪心问题,我们可以尝试一下三种贪心策略:

(1)每次挑选价值最大的宝物装入背包

(2)每次挑选重量最小的宝物装入背包

(3)每次挑选性价比最大的宝物装入背包

我们思考发现:如果选择价值最大的宝物优先装,但是它的重量可能很大;如果选择重量最小的宝物优先装,但是它的价值又不一定大。所以,第一种和第二种贪心策略显然不是好的策略,舍弃。第三章贪心策略从性价比的角度出发,即每一件宝物都有各自的性价比,即:单位价值p=w/v 我们采取性价比最大的宝物优先装载,最终装不下的宝物进行分割,等于最后剩余的装载量乘以该宝物的单位价值,最终合成,那么最终的价值一定是最大的,即最优解。

三、背包问题

代码中有涉及到C++sort排序函数降序排列的方法,不太了解的小伙伴可以去看看我另一篇文章

链接:C++中常用的sort排序函数

背包问题的完整代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
const int N =1000005;
typedef struct treasure{double w;double v;double p;
}treasure;
//自定义比较函数cmp
bool cmp(treasure t1,treasure t2){return t2.p<t1.p;
}
treasure s[N];
int main(){int n,m;cout<<"请输入宝物的种类个数n和驴子的最大承载重量m"<<endl;cin>>n>>m;cout<<"请分别输入这"<<n<<"种宝物所对应的重量与价值"<<endl;for(int i=0;i<n;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;for(int i=0;i<n;i++){if(m>s[i].w){m-=s[i].w;sum+=s[i].v;}else{sum+=m*s[i].p;//分解宝物,部分装入break; }} cout<<"能够装入宝物的最大价值为:"<<sum<<"亿元"<<endl;return 0;
}

四、0-1背包问题

(1)区别

背包问题与0-1背包问题的区别在哪? 区别就在于剩余物品是否可以进行分割

物品可以进行分割的装载问题称为背包问题,物品不可以分割的装载问题称为0-1背包问题。

(2)原因

在物品不可分割的情况下,即0-1背包问题,其已经不具备贪心选择性质,即原问题的最优解无法通过一系列的局部最优解而得到,因此这类问题最终得到的有可能只是近似解。例如上面的背包问题,如果要求物品不可分割,那么最后剩余的装载空间将永远无法填满,永远闲置,故最终可能无法得到一个最优解,而是最优解的近似解。

(3)代码

#include<iostream>
#include<algorithm>
using namespace std;
const int N =1000005;
typedef struct treasure{double w;double v;double p;
}treasure;
//自定义比较函数cmp
bool cmp(treasure t1,treasure t2){return t2.p<t1.p;
}
treasure s[N];
int main(){int n,m;cout<<"请输入宝物的种类个数n和驴子的最大承载重量m"<<endl;cin>>n>>m;cout<<"请分别输入这"<<n<<"种宝物所对应的重量与价值"<<endl;for(int i=0;i<n;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;for(int i=0;i<n;i++){if(m>s[i].w){m-=s[i].w;sum+=s[i].v;}else{//sum+=m*s[i].p;//分解宝物,部分装入break; }} cout<<"能够装入宝物的最大价值为:"<<sum<<"亿元"<<endl;return 0;
}

最终价值与背包问题相比少了0.6,这一点就是物品不可分割所造成的。

最后留一个小问题供大家思考:

为什么在加勒比海盗船——最优装载问题中,船在没有装满还留有剩余空间的情况下,最终所得到的仍然是最优解。而在0-1背包问题中,在没有装满的情况下,最终得到的有可能只是最优解的近似解?

一键三连,动力不竭!

【贪心算法】阿里巴巴与四十大盗——背包问题与0-1背包问题相关推荐

  1. 贪心算法--阿里巴巴与四十大盗--背包问题

    一.问题描述 有一天,阿里巴巴赶着一头毛驴上山砍柴.砍好柴准备下山时,远处突然出现一股烟尘,弥漫着直向上空非扬,朝他这儿卷过来,而且越来越近.靠近以后,他才看清原来是一支马队,他们公有四十人,一个个年 ...

  2. 【贪心】阿里巴巴与四十大盗-背包问题

    题目 阿里巴巴因为偶然的机会进入了强盗们的宝库,他想拿走一些让乡亲们开开眼.他想每种宝物只拿一个,如果太重就用锤子凿开,但毛驴运载能力有限,怎么才能用毛驴运走最大价值的宝物呢? 数据 输入 第一行:宝 ...

  3. 贪心算法之阿里巴巴与四十大盗(背包问题)

    1.问题 有一天,阿里巴巴赶着一头毛驴上山砍柴.砍好柴准备下山时,远处突然出现一股烟尘,弥漫着直向上空飞扬,朝他这儿卷过来,而且越来越近.靠近以后,他才看清原来是一支马队,他们共有四十人,一个个年轻力 ...

  4. 贪心算法 | 背包问题——阿里巴巴与四十大盗

    2.背包问题--阿里巴巴与四十大盗 问题:有一天,阿里巴巴赶着一头毛驴上山砍柴.砍好柴准备下山时,远处突然出现一股烟尘,弥漫着直向上空非扬,朝他这儿卷过来,而且越来越近.靠近以后,他才看清原来是一支马 ...

  5. 2.3阿里巴巴与四十大盗——背包问题

    2.3阿里巴巴与四十大盗--背包问题 2.3.1问题分析 2.3.2算法设计 2.3.3 完美图解 2.3.4 伪代码详解 2.3.5 实战演练 2.3.6算法分析及优化拓展 1.算法复杂度分析 2. ...

  6. 贪心——阿里巴巴与四十大盗(可拆分背包)

    问题 F: 阿里巴巴与四十大盗 时间限制: 1 Sec  内存限制: 128 MB 提交: 215  解决: 123 [提交][状态][讨论版][命题人:quanxing] 题目描述 有一天,阿里巴巴 ...

  7. 一个阿里小二“改写”了《阿里巴巴与四十大盗》 | 悦读

    <阿里巴巴与四十大盗>的故事人人皆知,这几天,一个阿里小二"改写"了这个故事.汲取于阿里巴巴公司内部日常生活的点点滴滴,这些细节被作者长勺总结成一本书<阿里巴巴与 ...

  8. http://39.98.219.132 题库标准答案(题库序号:1890)之阿里巴巴与四十大盗(ali)

    序号:1890 阿里巴巴与四十大盗(ali) Time Limit:1s Memory Limit:128MB 题目描述 四十大盗有一次拿到了许多金币,他们在考虑怎么分配这个财宝?思考良久,四十大盗的 ...

  9. 智能优化算法-阿里巴巴和四十大盗算法Ali baba and the Forty Thieves algorithm(附Matlab代码)

    引言 阿里巴巴和四十大盗算法Ali baba and the Forty Thieves algorithm是一种新的元启发式算法,用于解决全局优化问题.回想一下著名的阿里巴巴和四十大盗的故事,阿里巴 ...

  10. 贪心算法之阿里巴巴与四十大盗——背包问题

    14天阅读挑战赛 有一天,阿里巴巴赶着一头毛驴上山砍柴.砍好柴准备下山时,远处突然出现一股烟尘,弥漫着向上空飞扬,朝他这儿卷过来,而且越来越近.阿里巴巴心里害怕,担心碰到的是一伙儿强盗,他赶紧把毛驴赶 ...

最新文章

  1. 通过非docker的方式进行RocketMQ的安装
  2. Andorid之KeyguardManager的介绍
  3. 区间dp——cf1025D二叉搜索树的中序遍历好题!
  4. linux php mysql安装包下载_在linux下手动安装 apache, php, mysql--终极版
  5. (189)FPGA变量初始化方法reg
  6. 限时|领取黄博士整理的人工智能数学资料
  7. [转]快速矩阵快速幂
  8. Win10中英文切换 win键+空格
  9. 线性代数齐次方程求解与非齐次方程的解的关系
  10. 有关凸集的证明例题_凸集/凸函数习题
  11. 腾讯qlv格式转换mp4为何转换后只有音频
  12. python修图和ps_会照片处理的不只是ps,还有Python!
  13. CC00154.bigdatajava——|JavaMySQL.高级.V26|——|MySQL.v27|锁机制_锁概念介绍|
  14. 获取深户股市列表api_利用Tushare获取沪深股票数据与股票数据分析
  15. 神经网络与矩阵表示之间的恩怨情仇
  16. ECharts实现带钓鱼岛和南海诸岛的中国(China)地图
  17. java 编程联系_《JAVA程序设计》结对编程联系_四则运算(第二周:整体性总结)...
  18. 压缩算法gorilla paper encoding原理
  19. NIO 选择 Onsemi 的 SiC 牵引功率模块
  20. 动态规划经典例题-国王的金矿问题

热门文章

  1. 常见的几种限流算法代码实现(JAVA)
  2. 我又一个朋友辞掉了公务员
  3. php德育元素,职业院校德育课程教学中的美育元素
  4. Android应用篇 - 6.0 到 9.0 的版本适配
  5. 2017 一季度全球最畅销手机前5名
  6. UBUNTU如何做成系统镜像文件
  7. 使用response实现文件的下载
  8. Google公开了Google Talk的协议Jingle
  9. 安装Oracle11g出现INS-13001环境不满足最低要求
  10. 深度优先算法和广度优先算法以及Networkx包的使用