有趣的编程(一)——海盗分金币问题如何编程求解

本文探讨了如何通过编程解决有趣的海盗分金币问题。当有n个海盗和k个金币时,遵循分配规则,第一个人如何提出方案以最大化自身利益。文章通过实例分析和抽象问题解析,展示了如何在保持‘先手优势’的情况下确定最优策略,并提供了Python代码实现。
摘要由CSDN通过智能技术生成

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个金币

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值