海盗分金-动态规划实现
经济学上有个“海盗分金”模型:是说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]
即兴写的,如果有疏漏请多多包涵
海盗分金-动态规划实现相关推荐
- 大象起舞:用PostgreSQL解海盗分金问题
作者简介 张泽鹏(redraiment):51信用卡信贷业务高级架构师. 资深挖坑不填党:在51先后挖过风控.信审.数据支持等多个互金信贷相关的坑 冷技术控:51内 PostgreSQL.FreeBS ...
- IBM面试题:海盗分金算法及其思想
IBM面试题: 妈妈有2000元,要分给她的2个孩子.由哥哥先提出分钱的方式,如果弟弟同意,那么就这么分.但如果弟弟不同意,妈妈会没收1000元,由弟弟提出剩下 1000元的分钱方式,这时如果哥哥同意 ...
- 有趣的海盗分金问题(博弈论)
海盗分金问题 关于海盗分金问题是经济学上的一个经典模型:是说5个海盗抢得100金币,他们按照抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,投票要超过半数同意方案才能被通过,否则他将被扔入 ...
- 【逻辑推理系列】海盗分金模型分析
海盗分金模型逻辑分析 经济学上有个"海盗分金"模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他 ...
- 博弈论之海盗分金(最严谨)
为什么要强调严谨版呢?因为大多数地方都最终有两个结果,但其实,如果严格来说,只有一个答案. 博弈论又被称为对策论,是现代数学的一个重要分支,在经济学.金融学.计算机科学.政治学.军事战略学等方面有着重 ...
- 由“三姬分金”到“海盗分金”
"秦时明月--天行九歌篇"中有这么一章:"三姬分金". http://www.tudou.com/albumplay/QxZOIU2BloQ/B4u0I7Vxm ...
- 博弈论 —— 海盗分金
1. 博弈论基本概念 局中人同时做决策的博弈,叫"静态博弈". 如果决策有先后,后面的人,可以根据前面人的决策,决定和调整自己的决策,就叫"动态博弈". 先决策 ...
- 无往不利:用SQL解海盗分金的利益最大化问题
杨廷琨,网名 yangtingkun 云和恩墨技术总监,Oracle ACE Director,ACOUG 核心专家 热爱Oracle技术的专家们,他们的世界就是这样的:见猎心喜,遇难而技痒. 崔华老 ...
- 海盗分金c语言算法,[经典算法]海盗分金问题sql求解(贪心算法)
问题: 经济学上有个"海盗分金"模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他将被扔入大海喂 ...
最新文章
- string.h 的实现
- hdu 5100 n*n棋盘放k*1长方条最多覆盖面积
- VMWare 安装 Linux
- (转)淘淘商城系列——使用JsonView来格式化json字符串
- struts+spring action应配置为scope=prototype
- 经济数据预测 | Python实现ELM极限学习机股票价格时间序列预测
- Linux服务器安全加固
- 优麒麟系统安装MySQL_优麒麟系统安装教程-电脑系统安装手册
- 新版edge浏览器换主题皮肤,使用Chrome浏览器的主题皮肤
- 关于MacBook蓝牙键盘鼠标耳机等设备各种的卡顿、黏滞、断开连接等各种问题解决方案
- html 滑屏 效果,HTML5 web app实现手动页面滑屏效果
- java计算机毕业设计银创科技有限公司人事信息系统源码+数据库+系统+lw文档+部署
- 【原创】技术员 Ghost Win 10 X86 企业贺岁版2018
- 美容院如何提升员工敬业度?
- js逆向加密五邑大学教务系统密码AES实现模拟登录(仅供参考)
- Camera ITS测试
- 关于编程学习的心态与方法
- 单例模式-高性能单例模式
- Total Bummer:关键水滴
- Word怎么删除空白页?分享5个基础方法!