0. 写作目的
有趣的编程。
1. 问题描述
有n个海盗,分k个金币。
分配原则:依次从第一个人到最后一个人提出分配方法,只有当超过半数的人同意时,方案生效。如果该人提出的方案不能生效,则该人会被扔到水里喂鱼。游戏只能玩一次。问:第一个人如何提出分配方案才能最大化自己的利益?
假设:1) 所有的海盗都很聪明,而且理智;
2) 人性本恶(如当只有两个人时,无论第一个人如何分配,即使第一个不要金币,第二个人都不同意第一个的分配方案,则第一个人必死。)
3) 每个海盗在获取自己最大利益时,会采用赌博心理,即最大化可能得到的金币数目
2. 实例问题分析
先从简单的问题分析: 假设金币有100个。
当n = 1时,所有金币都是第一个人的。
当n = 2时,第一个人0个金币,第二个人100个金币。(因为无论第一个人如何分配,只要第二个人不同意,则第一个人必死。)
当n = 3时,第一个人100个金币,第二个人0个金币,第三个人0个金币。(由于第二个人知道如果第一个人死了,则第二个人也必死,因此第二个人必须同意第一个人的分配方案。这件事情第一个人也是知道的,因此第一个人可以任意分配。)
当n = 4时,第一个人98个金币,第二个人0个金币,第三个人1个金币,第四个人1个金币。(第一个人知道如果自己死了,每个人金币的分配情况。因此第一个人不能拉拢第二个人,也拉拢不来。第一个人需要拉拢的是第三个人和第四个人,因此只要他们的金币优于当n = 3时的分配情况,第三个人和第四个人就会同意第一个人的分配方案。)
当n = 5时,第一个人97个金币,第二个人0个金币,第三个人1个金币,第四个人2个金币,第五个人0个金币。(或者第四个人0个金币,第五个人2个金币)(第一个人知道当n = 4时金币分配的情况,由于需要半数,因此需要拉拢2个人。首先第二个人肯定拉拢不过来,需要拉拢的是第三个人,给1个金币