逻辑题-海道分金-java
/*********************@author map
*@email godmap@126.com
*@qq 9842058
********************/
/*******************************************************************************
* 5名海盗分100枚金币,每一枚都是一样的大小和价值。规则如下:
* 1.先是抽签来决定自己的号码(1,2,3,4,5)
* 2.接下来首先由抽得1号的海盗提出分配方案,然后大家5名海盗进行表决,“当且仅当”超过了半数的海盗同意时,按照他的提案进行分配,否则将被处死。
* 3.如果1号被处死,由2号提出分配方案,然后剩下的这4名海盗进行表决,还是“当且仅当”超过了半数的海盗同意时,按照他的提案进行分配,否则将被处死。
* 4.以此类推
* 条件:每名海盗都是极聪明的人,都能很理智的判断、做出选择,他们的目标都是想得到最多的金币。
* 问题:第一名海盗提出怎样的分配方案才能够使自己得到最多的金币?
******************************************************************************/
public class Haidao {
public static void main(String[] args) {
int h1, h2, h3, h4, h5;
int l1=0, l2=0, l3=0, l4=0, l5=0;
int coin = 100;
int i = 0;
for (h1 = 0; h1 <= coin; h1++) {
for (h2 = 0; h2 <= h1; h2++) {
for (h3 = 0; h3 <= h2; h3++) {
for (h4 = 0; h4 <= h3; h4++) {
for (h5 = 0; h5 <= h4; h5++) {
if ((((coin-h1)/2) >= h1) && (h1+h2+h3+h4+h5==coin)) {
if (((h1<=h2 && h1<=h3) || (h1<=h2 && h1<=h4) || (h1<=h2 && h1<=h5) || (h1<=h3 && h1<=h4) || (h1<=h4 && h1<=h5))) {
l1=h1;
l2=h2;
l3=h3;
l4=h4;
l5=h5;
i++;
}
}
}
}
}
}
}
System.out.println("Total " + i + " scheme passed! \nBut only this scheme pirate_1 will cleanup the max, like this:");
System.out.println("海盗1"+"\t"+"海盗2"+"\t"+"海盗3"+"\t"+"海盗4"+"\t"+"海盗5" );
System.out.println(l1+"\t"+l2+"\t"+l3+"\t"+l4+"\t"+l5);
}
}
[ 本帖最后由 godmap 于 2007-5-9 19:09 编辑 ] 楼主理解的意思是,只要其他两名海盗同意海盗1的分法,那么就通过了。
怎样才能,要其他两名海盗同意海盗1的分法呢?
首先想到的就是,海盗1的金币不能大于其他两名海盗所得,所以有这句:
if (((h1<=h2 && h1<=h3) || (h1<=h2 && h1<=h4) || (h1<=h2 && h1<=h5) || (h1<=h3 && h1<=h4) || (h1<=h4 && h1<=h5)))
楼主用了穷举法,需要排除很多无效数据,所以有这句:
if ((((coin-h1)/2) >= h1) && (h1+h2+h3+h4+h5==coin))
后面的语句,就是将符合以上条件的分法赋值。最后一个i++是,所有能通过的分配方案的计数器。
这个题这样做,是有点问题的。
没有考虑5名海盗之间的博弈情况。 不错sdlkfj3 同意2楼说的。
就拿5号海盗来说,他如果把前面的全部否决掉,就可以得到全部的金币。所以前面的人员在分配时就不用考虑给5号了,因为只要不是给他全部,他都会否决掉。
页:
[1]