51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2683|回复: 3
打印 上一主题 下一主题

[原创] 逻辑题-海道分金-java

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-5-9 19:07:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/********************
*@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 编辑 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2007-5-9 23:35:11 | 只看该作者
楼主理解的意思是,只要其他两名海盗同意海盗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名海盗之间的博弈情况。
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2007-5-10 08:44:50 | 只看该作者
不错sdlkfj3
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2007-5-10 09:35:56 | 只看该作者
同意2楼说的。
就拿5号海盗来说,他如果把前面的全部否决掉,就可以得到全部的金币。所以前面的人员在分配时就不用考虑给5号了,因为只要不是给他全部,他都会否决掉。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-9-29 00:17 , Processed in 0.085115 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表