今天同学跟我讲海盗分金币这道IQ题,突然想这应该可以用程序来解,所以就尝试了一下:
命题 写道
有5个海盗抢到100个金币,他们都很贪婪,但又很聪明理智,所以他们商量出了个方法来分配,先抽签产生12345号,然后按顺序提出一个分配方案,如果未能超过半数,他就要被扔到海里喂鲨鱼,请问该怎么分配那自己才能拿最多的金币。
import java.util.ArrayList;
import java.util.Collections;
public class PirateProblem
{
private static final int ALLCOINS = 100;
public static void main(String[] args)
{
for (int numPirate = 2; numPirate < 8; numPirate++)//输出2个到7个海盗的情况
{
System.out.print(numPirate+"个海盗时:");
int[] finalResult = solve(numPirate);
for (int each : finalResult)
{
System.out.print(each + ",");
}
System.out.println();//换行
}
}
public static int[] solve(int n)//递归解决
{
int[] result = new int[n];
if (n == 2)
{
result[0] = ALLCOINS;
result[1] = 0;
return result;
}
int[] preResult = solve(n - 1);//假设少一个人的时候的结果
ArrayList<Pirate> pirateList = new ArrayList<Pirate>();
for (int index = 0; index < preResult.length; index++)//存入list中方便排序
{
pirateList.add(new Pirate(index, preResult[index]));
}
Collections.sort(pirateList);//排序
for (int index = 0; index < preResult.length; index++)
{
Pirate temp = pirateList.get(index);
if (index < (n / 2))//争取半数人同意
{
preResult[temp.getNumber()] = preResult[temp.getNumber()] +1;
}
else//其余的人不管
{
preResult[temp.getNumber()] = 0;
}
}
int coinsGotByFirstPirate=ALLCOINS;//初始化为总硬币个数
for (int index = 0; index < preResult.length; index++)
{
result[index+1]=preResult[index];
coinsGotByFirstPirate-=preResult[index];//减去以分配出去的硬币个数
}
result[0]=coinsGotByFirstPirate;//第0个海盗的就是第一个海盗
return result;
}
}
其中有一个Pirate类:
public class Pirate implements Comparable<Pirate>
{
private Integer number;
private Integer coins;
public Pirate(int number, int coins)
{
super();
this.number = number;
this.coins = coins;
}
public Integer getCoins()
{
return coins;
}
public Integer getNumber()
{
return number;
}
@Override
public int compareTo(Pirate pirate)
{
return this.coins.compareTo(pirate.getCoins());
}
}
结果:
2个海盗时:100,0,
3个海盗时:99,0,1,
4个海盗时:97,0,1,2,
5个海盗时:97,0,1,2,0,
6个海盗时:96,0,1,2,0,1,
7个海盗时:96,0,1,2,0,1,0,
分享到:
相关推荐
2. 改变一下规则,投票中方案必须得到超过50%的票数(只得到50%票数的方案的提出者也会被丢到海里去喂鱼),那么如何解决5个海盗分100枚金币的问题? 3. 不改变规则,如果让100个海盗分100枚金币,会发生什么? 4. ...
经济学上有个“海盗分金”模型,是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他将被扔入大海喂鲨鱼,依此类推。“海盗分金”其实是...
#经济学上有个“海盗分金”模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,投票要超过半数同意方案才被通过,否则他将被扔入大海喂鲨鱼,依此类推。 #假定“每...
昨天整理移动硬盘,竟然翻出了五年前的小程序源码。记得当时是在中国人民大学边上的一个小公园里花了一个... 这里所说的复杂问题是指一个很古老的问题——海盗分金问题…… 详细内容请参考压缩包中《重要说明.doc》
海盗分宝石的求解程序,C#语言开发,需要 Dot Net 2.0 环境支持
博弈-海盗分金模型借鉴.pdf
海盗分金问题 C语言实现,支持N个海盗M个黄金 的分配,结果写在文件中
Corsair海盗船Raptor H3游戏耳机驱动For WinXP-32/WinXP-64/Vista-32/Vista-64/Win7-32/Win7-64/Win8-32/Win8-64(2014年1月21日发布)海盗船Raptor猛禽系列H3游戏耳机在音质表现的相当优异,尤其是游戏声音中一些重...
海盗分宝石的逻辑模型,C#2.0编写,每条语句都附有通俗易懂的注释,可供学习研究使用。 压缩包内另一目录是编译后生成的安装程序。
PirateMap, 程序生成海盗宝藏地图 海盗地图程序生成的海盗宝藏地图。 X 标出地点 ! 依赖项我使用了几个优秀的第三方图书馆。用于渲染的cairo用于颜色插值的colour用于单工噪声的noise用于保存噪声层的调试图像的...
海盗船h115i水冷驱动是一款专为贼船水冷散热器h115i型号专用驱动程序,海盗船h115i驱动完整安装后可数据化的显示、管理散热器各项信息方便用户管理,需要此款工具的朋友们欢迎前来下载使用。 软件说明 海盗...
著名的海盗分金的源代码,也是ACM训练过程中必做的一道题
海盗船k70rgb驱动是一款专为海盗船corsairk70rgb键盘打造的驱动程序,这款键盘外形霸气、做工精致,操作手感舒适,漂亮又好用,如果你想对键盘进行更多功能设置,欢迎在下载该驱动!驱动介绍此款驱动是海盗船k70rgb...
关于海盗分金的一个问题--和最小且相等问题
逻辑推理题 海盗分钻石 详细解答,绝对正确,给你启发
博弈-海盗分金模型.pdf
海盗派测试分析.pdf
《学习要像加勒比海盗:自我教育如何引领你走向成功》作者詹姆斯·巴哈(经典畅销书《海鸥乔纳森》作者理查德·巴哈的儿子)就是其中的代表人物之一。和许多年轻人一样,詹姆斯厌倦了正统的学校教育,没有读完高中就...
海盗王数据库,海盗王数据库,海盗王数据库,