[谜题]海盗分金-逆向思维
安妮女王复仇号上有n个海盗,一天他们洗劫了皇家港抢到了m枚金币,现在海盗们准备瓜分金币,但是分金币必须要遵循《海盗法典》。
法典规定:
金币不能分割;
船上的海盗需要按照地位进行排序,地位越高的海盗编号越高;
从编号最高的海盗开始提出金币分配方案,船上的海盗(包括提出方案的那个)一起对方案进行表决,如果分配方案得到一半或以上的海盗支持,那么方案就获得通过,如果方案没能得到半数支持,那么提出该方案的海盗就将被逼迫跳海去喂鱼,而后由编号第二大的海盗提出方案重复这一过程,直到某个海盗的方案获得通过。
假设:
每个加勒比海盗首先想到的是确保自己的性命(人之常情)
其次是获得更多的金币(海盗都是贪婪的)
他们希望看到更多的其他海盗跳海(估计每个海盗都想独占安妮女王复仇号)
所有的海盗都严格遵循这个优先级顺序,并且他们都是完全理性的,他们也知道其他海盗是完全理性的
先解决10个海盗分100枚金币的问题,下面用自己的语言分析:
题目:10名海盗抢得了窖藏的100块金子,并打算瓜分这些战利品。
这是一些讲民主的海盗(当然是他们自己特有的民主),他们的习惯是按下面的方式进行分配:
最厉害的一名海盗提出分配方案,然后所有的海盗(包括提出方案者本人)就此方案进行表决。如果50%或更多的海盗赞同此方案,此方案就获得通过并据此分配战利品。否则提出方案的海盗将被扔到海里,然后下面一个提名最厉害的海盗又重复上述过程。
介绍一下背景知识:
①假设所有海盗的地位是不一样的,可以按照凶狠程度排好序;
②而且每一个海盗都是很有逻辑的,非常理性,会很认真分析自己的利益;
③作为一个合格的海盗,他们是十分凶狠的,总是希望其他人都死掉才好;
④同时呢,自己的生命是摆在第一位的,金钱其次;
⑤还有一点,他们很现实,二鸟在林,不如一鸟在手。
问题:最凶的一名海盗应当提出什么样的分配方案才能使他获得最多的金子呢?
分析:
这是一个典型的动态规划问题,需要自底向上求解,简单来说,先分析最简单的情况,再推复杂的,也就是由基本问题开始。(就我来看,也可以叫做是逆向思维,毕竟投票进行到最后,只剩下几个人的时候是很简单的)
解答:
①首先,将所有海盗排好序,最厉害的海盗记作P10,最菜的海盗记作P1,接着从只有一个海盗开始分析:
至少需要 0 票
毫无疑问,一个人独吞。
P1 |
---|
100 |
②加上P2:
至少需要 1 票
P2 随便提出一个方案,自己同意就好,这一票就达到总人数的一半了,所以干脆拿走100金子。
P2 | P1 |
---|---|
100 | 0 |
③下面就开始要好好考虑了:
至少需要 2票
P2想,只要干掉P3,那么所有金子一定是自己的,所以一定不会同意P3的方案。对于聪明的P3,知道P2是不会同意自己的,所以就想着怎么去收买(这个用词很恰当)P1,因为只有这样才能凑够2票(一定不能忘记自己的一票),大于总人数的一半(1.5)。
所以呢,P2一分不给(反正给多少都不领情),P1给1块,总比方案制定权落到P2手里的0要好些,最后算一算,自己还剩99,不错不错。
P3 | P2 | P1 |
---|---|---|
99 | 0 | 1 |
④至少需要 2 票
那好,P4只需要收买一个人就好,谁呢。照着②的思路,P3是大概率不领情的,就从P2和P1里面选一个,当时买P2比较好。如果P2不支持P4,结果P4挂掉的话,自己就什么都没有了(轮到P3那块就投票成功了,③中的情况成立,轮不到②,可以说卡在③那里了),所以会支持P4,只要给一点好处,不然的话,也是很情愿看着他死翘翘的。P1和P2类似,但是收买他比较贵,因为③中他可是得到了1,而P2没有。
综上,P4花掉1块收买P2,完美,自己拿走99。
P4 | P3 | P2 | P1 |
---|---|---|---|
99 | 0 | 1 | 0 |
好了,到这里就看出规律来了,轮到海盗Pi,就看看轮到P(i+1)的情况,想办法收买这个时候得到金子少的人,没有得到的最后。
下面列出所有情况:
最右侧一栏表示轮到谁来制定方案
P10 | P9 | P8 | P7 | P6 | P5 | P4 | P3 | P2 | P1 | |
---|---|---|---|---|---|---|---|---|---|---|
100 | P1 | |||||||||
100 | 0 | P2 | ||||||||
99 | 0 | 1 | P3 | |||||||
99 | 0 | 1 | 0 | P4 | ||||||
98 | 0 | 1 | 0 | 1 | P5 | |||||
98 | 0 | 1 | 0 | 1 | 0 | P6 | ||||
97 | 0 | 1 | 0 | 1 | 0 | 1 | P7 | |||
97 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | P8 | ||
96 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | P9 | |
96 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | P10 |
P10会得到96块金子
接下来,把问题难度加大,
题目:500名海盗分100块金子
这就设计到金子不够的问题了,那么从什么时候开始短缺呢?
至少需要100票
从上面的规律来看,轮到P200时,编号为偶数的有1块金子,其他人没有。
P200 | P199 | … | P2 | P1 |
---|---|---|---|---|
1 | 0 | … | 1 | 0 |
至少需要101票
然后考虑P201,显然为了收买100人,自己没有了。
P201 | P200 | P199 | … | P2 | P1 |
---|---|---|---|---|---|
0 | 0 | 1 | … | 0 | 1 |
假设每次 P1~P200 中有100人被收买,其实每次只要收买上一种情况下没有得到好处的人即可,有很多种分配方案,这里做简化
至少需要101票
到了P202,最多收买100,自己还是没有,但可以保住性命。
P202 | P201 | P200 | P199 | … | P2 | P1 |
---|---|---|---|---|---|---|
0 | 0 | 1 | 0 | … | 1 | 0 |
至少需要102票
之后呢,对P203来说就麻烦了,需要得到102张票,除去100块金子收买的100人和自己,还需要一票,可是这个时候是不会得到的,因为P201和P202并没有得到好处(假设收买的人在P1~P200中),非常高兴看着他跳进海里喂鱼。那么P202就一定挂掉了。
至少需要102票
换成P204,他知道P203一定会死翘翘,所以断定他一定会支持自己,这样就得到了一个铁杆粉丝,就好办了,再花100块金子收买100人即可
至少需要103票
P205,他是没有铁杆粉丝的,因为P204不会一定去喂鱼,所以得不到这么多票,好的,乖乖跳海喂鱼。
接下来P206、P207也挂了,就好像傀儡一样,一定会喂鱼的海盗肯定支持前面的海盗,这种情况持续到有一个海盗会活下来为止,因为这个是大家都没事了,不愿意去管更前面的事,这样的话傀儡清零。
该P208了,惊喜的发现自己的傀儡攒够了,于是投票成功。
好的,这样一直算到P216,他是下一位幸运儿。
简单整理一下这里的存活者:P216、P208、P204、P202、P201、P200 … P1
有点规律:
偶数号的海盗收买前200人中偶数号的人,奇数号的海盗收买前200人中基数号的人。
那么对于500人分100块金子这个问题来说,前面44位大哥都跳海喂鱼去了,P456活下来,他收买了P1~P200中偶数号的人,分配结束。
那么,从另外一个方向分析题目
题目:将投票人数从至少50%改为超过50%
P10 | P9 | P8 | P7 | P6 | P5 | P4 | P3 | P2 | P1 | 海盗 | 最少票数 |
---|---|---|---|---|---|---|---|---|---|---|---|
100 | P1 | 1 | |||||||||
X | 100 | P2 | 2 | ||||||||
100 | 0 | 0 | P3 | 2 | |||||||
98 | 0 | 1 | 1 | P4 | 3 | ||||||
97 | 0 | 1 | 2 | 0 | P5 | 3 |
这里开始有不同了,P5只需要收买P2和P1其中一个即可。
P10 | P9 | P8 | P7 | P6 | P5 | P4 | P3 | P2 | P1 | 海盗 | 最少票数 |
---|---|---|---|---|---|---|---|---|---|---|---|
97 | 0 | 1 | 0 | 1 | 1 | P6 | 4 |
这里需要强调,对P2、P1来说,上面一种分配方式中两人中有且仅有一人得到2块金币,是不确定的,这个时候P6给他们每人1块,二鸟在林,不如一鸟在手,他们很现实,所以会偏向肯定能拿到手里的1块,避免什么也得不到的可能发生,这样两人都被收买了。
P10 | P9 | P8 | P7 | P6 | P5 | P4 | P3 | P2 | P1 | 海盗 | 最少票数 |
---|---|---|---|---|---|---|---|---|---|---|---|
96 | 0 | 1 | 2 | 1 | 0 | 0 | P7 | 4 | |||
96 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | P8 | 5 | ||
95 | 0 | 1 | 2 | 1 | 0 | 1 | 0 | 0 | P9 | 5 | |
95 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | P10 | 6 |
所以P10可以拿到95块,分配结束。
[谜题]海盗分金-逆向思维相关推荐
- 大象起舞:用PostgreSQL解海盗分金问题
作者简介 张泽鹏(redraiment):51信用卡信贷业务高级架构师. 资深挖坑不填党:在51先后挖过风控.信审.数据支持等多个互金信贷相关的坑 冷技术控:51内 PostgreSQL.FreeBS ...
- IBM面试题:海盗分金算法及其思想
IBM面试题: 妈妈有2000元,要分给她的2个孩子.由哥哥先提出分钱的方式,如果弟弟同意,那么就这么分.但如果弟弟不同意,妈妈会没收1000元,由弟弟提出剩下 1000元的分钱方式,这时如果哥哥同意 ...
- 海盗分金-动态规划实现
经济学上有个"海盗分金"模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,投票要超过半数同意方案才被通过,否则他将被扔入大海喂鲨 ...
- 有趣的海盗分金问题(博弈论)
海盗分金问题 关于海盗分金问题是经济学上的一个经典模型:是说5个海盗抢得100金币,他们按照抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,投票要超过半数同意方案才能被通过,否则他将被扔入 ...
- 【逻辑推理系列】海盗分金模型分析
海盗分金模型逻辑分析 经济学上有个"海盗分金"模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他 ...
- 博弈论之海盗分金(最严谨)
为什么要强调严谨版呢?因为大多数地方都最终有两个结果,但其实,如果严格来说,只有一个答案. 博弈论又被称为对策论,是现代数学的一个重要分支,在经济学.金融学.计算机科学.政治学.军事战略学等方面有着重 ...
- 由“三姬分金”到“海盗分金”
"秦时明月--天行九歌篇"中有这么一章:"三姬分金". http://www.tudou.com/albumplay/QxZOIU2BloQ/B4u0I7Vxm ...
- 博弈论 —— 海盗分金
1. 博弈论基本概念 局中人同时做决策的博弈,叫"静态博弈". 如果决策有先后,后面的人,可以根据前面人的决策,决定和调整自己的决策,就叫"动态博弈". 先决策 ...
- 无往不利:用SQL解海盗分金的利益最大化问题
杨廷琨,网名 yangtingkun 云和恩墨技术总监,Oracle ACE Director,ACOUG 核心专家 热爱Oracle技术的专家们,他们的世界就是这样的:见猎心喜,遇难而技痒. 崔华老 ...
最新文章
- coordinatorlayout 设置不可滑动_滑动关闭App损害iPhone电池寿命,我们需要“改掉强迫症”吗?...
- wx.getBLEDeviceCharacteristics 微信小程序蓝牙 微信小程序热敏打印机
- 苹果拟明年Q1推出配有mini-LED显示屏的27英寸iMac
- Caffeine 和 Redis 居然可以这么搭,想不到吧!
- Paip.Php Java 异步编程。推模型与拉模型。响应式(Reactive)”编程FutureData总结... 1
- 计算机 线性代数答案,2013-2014-1《线性代数》计算机B答案
- vivado仿真脚本生成
- 遗传算法求解TSP问题(C++实现)
- 金蝶K3系统个别用户操作卡顿的处理办法
- linux云主机登陆教程,登录linux云服务器的详情步骤
- flink设置checkpoint部署后一直重启,出现检查点无法写入的问题
- windows10 安装office2021(预装正版)经验分享
- RPG Maker MV 路标,随机移动,随机对话
- vue垂直布局_基于 Flex 实现两端对齐垂直布局
- 人生就是一场永不停歇的修行
- 【Stephen Boyd】应用线性代数导论课件
- 马化腾演讲、张勇内部讲话暴露两大巨头云上端倪
- 《财务自由之路》博多.舍费尔 篇一,关于金钱和财务自由
- notepad++快捷键使用
- 公共关系礼仪实务章节测试题——社会关系和公共关系(三)
热门文章
- Windows 10 系统下载网址推荐
- Android studio里packagename和applicationId
- Android Studio页面跳转共享参数
- uni-icons中添加自定义图标
- 互联网摸鱼日报(2023-01-26)
- [rust] Rust与C++20编码习惯对照
- linux 系统基础命令
- Day65:Python获取阿里云产品云监控数据指标
- node sass 报错解决方法 Module build failed (from ./node_modules/sass-loader/dist/cjs.js)
- 什么是Sentinel