经济学上有个“海盗分金”模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,投票要超过半数同意方案才被通过,否则他将被扔入大海喂鲨鱼,依此类推。

假定“每个海盗都是绝顶聪明且很理智”,那么“第一个海盗提出怎样的分配方案才能够使自己的收益最大化?”

推理过程是这样的:

1.如果只剩两个海盗 那么海盗4无论提什么,海盗5都会否决.

2.所以海盗3 可以提出 100 ,0,0的方案(这里假设海盗1,2如果入水了)

3.海盗2 要拉拢两个人才能通过方案,只要放弃3号给4,5两人1人1个金币就好了(98,0,1,1)

4.海盗1 也要拉拢人,那么需要在海盗2的基础上加码,放弃海盗2(97,0,1,2,0)

那如果6个海盗呢,7个海盗呢

以下是算法思路

1.海盗n要争取除自己外n/2的人同意

2.分配按保守来(海盗n,拉拢n/2个人,并且提出的分配方案比他之前的更加有诱惑力 )

比如 海盗n-1到海盗1提出的方案里,能给他拉拢的人最多x个金币,海盗n就给他x+1个

这个典型的就是动态规划问题

3.dp去记录每个海盗的分配方案中 除分配人以外每个人能获得的最大值

比如4个海盗的时候的dp=[0,1,1](第一个0代表第三个人被放弃了,按照推理每个海盗都会放弃他前一个人)

那么5个海盗就从中取出5/2=2个最小的值,分别给他们都加1个金币 (5选择拉拢成本较小的4,和3)结果就是 dp=[0,1,2,1]

6个就是[0,1,2,2,2](注意dp是前面方案里的最大值,所以把海盗n要拉拢的对象+1,其他保持不变)

以下是代码实现

public class Coin {//n>3public List<List<Integer>> solution(int n,int coin) {List<List<Integer>> results=new ArrayList<>();List<Integer> ret=new ArrayList<>(4);Collections.addAll(ret,98,0,1,1);results.add(ret);List<Integer> dp=new LinkedList<>();Collections.addAll(dp,0,1,1);for (int i = 5; i <= n; i++) {List<Integer> retNow=new ArrayList<>(i);//初始化for (int i1 = 0; i1 < i; i1++) {retNow.add(0);}//除自己外需要支持的海盗数int num = i / 2;//找出需要金币最小的几个海盗Set<Integer> set=new HashSet<>();int sum = 0;while (--num>=0){int min=Integer.MAX_VALUE;int index=0;for (int j = 0; j < dp.size(); j++) {if(min>dp.get(j)&&!set.contains(j)){min=dp.get(j);index=j;}}set.add(index);min=min+1;sum+= min;dp.set(index,min);retNow.set(index+2,min);}dp.add(0,0);if(coin-sum<0)break;retNow.set(0,coin-sum);results.add(retNow);}return results;}public static void main(String[] args) {List<List<Integer>> list=new Coin().solution(100,100);for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}}
}
分配结果如下
[98, 0, 1, 1]
[97, 0, 1, 2, 0]
[95, 0, 1, 2, 0, 2]
[94, 0, 1, 2, 3, 0, 0]
[91, 0, 1, 2, 3, 0, 3, 0]
[91, 0, 1, 2, 3, 0, 0, 0, 3]
[86, 0, 1, 2, 3, 4, 4, 0, 0, 0]
[86, 0, 1, 2, 3, 4, 0, 0, 4, 0, 0]
[82, 0, 1, 2, 3, 4, 0, 0, 0, 0, 4, 4]
[80, 0, 1, 2, 3, 4, 5, 5, 0, 0, 0, 0, 0]
[75, 0, 1, 2, 3, 4, 5, 0, 0, 5, 5, 0, 0, 0]
[75, 0, 1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 5, 5, 0]
[68, 0, 1, 2, 3, 4, 5, 6, 6, 0, 0, 0, 0, 0, 0, 5]
[67, 0, 1, 2, 3, 4, 5, 6, 0, 0, 6, 6, 0, 0, 0, 0, 0]
[61, 0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 6, 6, 6, 0, 0]
[60, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6]
[51, 0, 1, 2, 3, 4, 5, 6, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0]
[51, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0]
[44, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7]
[40, 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[32, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0]
[32, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 0, 0]
[21, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8]
[19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0]
[9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9]

即兴写的,如果有疏漏请多多包涵

海盗分金-动态规划实现相关推荐

  1. 大象起舞:用PostgreSQL解海盗分金问题

    作者简介 张泽鹏(redraiment):51信用卡信贷业务高级架构师. 资深挖坑不填党:在51先后挖过风控.信审.数据支持等多个互金信贷相关的坑 冷技术控:51内 PostgreSQL.FreeBS ...

  2. IBM面试题:海盗分金算法及其思想

    IBM面试题: 妈妈有2000元,要分给她的2个孩子.由哥哥先提出分钱的方式,如果弟弟同意,那么就这么分.但如果弟弟不同意,妈妈会没收1000元,由弟弟提出剩下 1000元的分钱方式,这时如果哥哥同意 ...

  3. 有趣的海盗分金问题(博弈论)

    海盗分金问题 关于海盗分金问题是经济学上的一个经典模型:是说5个海盗抢得100金币,他们按照抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,投票要超过半数同意方案才能被通过,否则他将被扔入 ...

  4. 【逻辑推理系列】海盗分金模型分析

    海盗分金模型逻辑分析 经济学上有个"海盗分金"模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他 ...

  5. 博弈论之海盗分金(最严谨)

    为什么要强调严谨版呢?因为大多数地方都最终有两个结果,但其实,如果严格来说,只有一个答案. 博弈论又被称为对策论,是现代数学的一个重要分支,在经济学.金融学.计算机科学.政治学.军事战略学等方面有着重 ...

  6. 由“三姬分金”到“海盗分金”

    "秦时明月--天行九歌篇"中有这么一章:"三姬分金". http://www.tudou.com/albumplay/QxZOIU2BloQ/B4u0I7Vxm ...

  7. 博弈论 —— 海盗分金

    1. 博弈论基本概念 局中人同时做决策的博弈,叫"静态博弈". 如果决策有先后,后面的人,可以根据前面人的决策,决定和调整自己的决策,就叫"动态博弈". 先决策 ...

  8. 无往不利:用SQL解海盗分金的利益最大化问题

    杨廷琨,网名 yangtingkun 云和恩墨技术总监,Oracle ACE Director,ACOUG 核心专家 热爱Oracle技术的专家们,他们的世界就是这样的:见猎心喜,遇难而技痒. 崔华老 ...

  9. 海盗分金c语言算法,[经典算法]海盗分金问题sql求解(贪心算法)

    问题: 经济学上有个"海盗分金"模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他将被扔入大海喂 ...

最新文章

  1. string.h 的实现
  2. hdu 5100 n*n棋盘放k*1长方条最多覆盖面积
  3. VMWare 安装 Linux
  4. (转)淘淘商城系列——使用JsonView来格式化json字符串
  5. struts+spring action应配置为scope=prototype
  6. 经济数据预测 | Python实现ELM极限学习机股票价格时间序列预测
  7. Linux服务器安全加固
  8. 优麒麟系统安装MySQL_优麒麟系统安装教程-电脑系统安装手册
  9. 新版edge浏览器换主题皮肤,使用Chrome浏览器的主题皮肤
  10. 关于MacBook蓝牙键盘鼠标耳机等设备各种的卡顿、黏滞、断开连接等各种问题解决方案
  11. html 滑屏 效果,HTML5 web app实现手动页面滑屏效果
  12. java计算机毕业设计银创科技有限公司人事信息系统源码+数据库+系统+lw文档+部署
  13. 【原创】技术员 Ghost Win 10 X86 企业贺岁版2018
  14. 美容院如何提升员工敬业度?
  15. js逆向加密五邑大学教务系统密码AES实现模拟登录(仅供参考)
  16. Camera ITS测试
  17. 关于编程学习的心态与方法
  18. 单例模式-高性能单例模式
  19. Total Bummer:关键水滴
  20. Word怎么删除空白页?分享5个基础方法!

热门文章

  1. 关于LM3886TF
  2. python之网络部分
  3. iphone13 设备类型 DeviceType
  4. 为什么有很深的windows基础还是不能动摇linux半步
  5. Leetcode 1564 把箱子放进仓库里1
  6. Whitelabel Error Page 解决办法
  7. HEVC视频扩展解决方法
  8. 视频马赛克的实时检测
  9. win10系统wifi能连上但不能上网怎么办
  10. 模电电路笔记———同向比例放大电路的使用