1000桶酒中含两桶毒酒问题

16 篇文章 0 订阅
6 篇文章 0 订阅

链接毒酒问题中给出如下问题:

国王为10天后的生日宴会准备了1000桶酒,不幸的是,其中两桶被下了毒。为了确定两桶毒酒,有人提议用死刑犯试毒。毒的潜伏期为10天。
问:至少需要多少个死刑犯才能确保找出毒酒?方案如何实行?

 

这个题目看上去是1000桶酒中含一桶毒酒问题的简单扩展,但是实际上难度远远大于一桶毒酒问题的情况.

 

利用信息论容易得出至少需要19个死囚才有可能找出所有毒酒.但是这只是一个粗糙的下界.

 

方案一:链接7#中六边形鸡尾酒构图使得使用6a+3个囚犯可以识别3a^2+3a+1桶酒(至多两桶毒酒)

 

 

方案二:Constant-weight code中利用别人现成的一些的结果得出一个41个囚徒解决1095桶酒的方案(正好两桶毒酒)

其中:A(n,d,w)表示那些长度为n比特的二进制数的集合的最大元素数目,其中集合中任何两个元素不同比特位数目不小于d,而每个二进制数正好有w比特为1.
那么对于A(n,w+1,w)中的方案(w为奇数),任何两个比特1数目为w的二进制数,不同的位置至少有w+1;也就是相同的比特1最多(w-1)/2个. 对应到本题,让A(n,w+1,w)桶酒让n个囚徒喝,其中n个比特位分别对应n个囚徒.每个二进制数对应一桶酒.每个二进制数上比特1对应的囚徒要喝掉对应的酒.
那么如果某桶酒有毒,那么那个对应的二进制数所有比特1对应的囚徒必然死去.反之如果某桶酒无毒,那么由于只有两桶毒酒,所以这个对应的二进制数最多有2*(w-1)/2=w-1个囚徒死去.
也就是我们可以根据每桶酒对应的二进制数所有比特1对应的囚徒是否全部死去来判断酒是否有毒.

 

链接25#给出一个复杂度的上界O(log^2(n)),而链接30#给出方法二在n充分大时可以到达复杂度O(log(n)),所以是非常不错的方法.

 

方案三:Union-free Hypergraphs and Probability Theory利用2^n阶有限群中的一个构造达到了4n个囚犯解决2^n桶酒的问题,从而利用40个囚徒解决了1024桶酒的方案(正好两桶毒酒)

 

方案四:令人惊奇的是通过google找到了一种概率方法,竟然可以优化到了33个囚徒.链接中的附件给出了33个囚徒和34个囚徒解决1000桶酒问题的一个方案(两桶毒酒)

 

链接65#通过计算机搜索找出一些在酒桶数目较小时的较优方案,得出囚徒数目不超过5时只能识别n+1桶酒,6人可以识别8桶,7人识别10桶.

而8人能够识别13桶(但是不知道是否最优,更多人时同样无法确保最优),9人16桶,10人20桶,11人26桶,12人32桶,13人39桶,14人47桶

 

方案五:但是没想到tannis_jin通过给出将类方案一方案进行改善也取得非常好的效果.实际上,比如方案一中六边形构图中,由于我们可以将问题划分成3组不同的每组2a+1种鸡尾酒的方案,其中2a+1种鸡尾酒有一种或二种是毒酒的识别问题.对这2a+1种鸡尾酒,我们不需要2a+1个囚徒,而只需要h(2a+1)个人,其中h(2a+1)是可以识别2a+1桶含最多两桶毒酒情况的最小人数.比如h(12)<=8,h(15)<=9,h(19)<=10,h(25)<=11,h(31)<=12,h(46)<=13于是我们得到3h(2a+1)个人可以识别3a^2+3a+1桶酒.所以根据前面计算机搜索的h(46)<=13可以得出39个人可以识别1519桶酒

 

方案六:在73#种tannis_jin进一步指出正方形方案可以做的比六边形方案更加好,于是a^2桶酒只需要2h(a)+h([a/2])个囚徒.而74#为此专门用计算机搜索12个人的方案结果找到了12个人识别33桶酒(包含两桶毒酒)或32桶最多包含两桶毒酒的方案.由此我们得到h(32)<=12

于是1024桶酒只需要2h(32)+h(16)<=2*12+10=34个囚徒.而其中h(16)非常有可能可以达到9,只是现在计算机没有搜索出来(计算机搜索出9个囚徒可以识别正好包含两桶毒酒的16桶酒,但是如果16桶中可能两桶毒酒或一桶毒酒,那么没有搜索成功).也就是34个囚徒识别了1024桶酒(其中正好两桶毒酒)

同样,tannis_jin把正方形方案扩展成10*10*10的立方体方案,也得出一个34个囚徒的方案.这个方案也可能可以改进(主要对角线方向的识别),即34人识别1000桶酒(正好两桶毒酒)的方案

 

而到现在为止,我们找到的最好的方案还是通过方案四中的概率方法得出的33个囚徒解决1000桶正好包含两桶毒酒的问题,次优方案是方案六中可以得出的34个囚徒的方案.当然我们还是无法知道最优方案是多少,可以确定的其范围在19个囚徒到33个囚徒之间

最后他们竟然通过使用随机算法优化到27个囚徒解决1090桶酒中包含两桶毒酒的问题。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
.版本 2 .如果真 (ItemID = 3020193) item.Name = “[魂玉]过关斩将” item.Color = Color_4 返回 (item) .如果真结束 .如果真 (ItemID = 3020185) item.Name = “[魂玉]七星夺窍” item.Color = Color_4 返回 (item) .如果真结束 .如果真 (ItemID = 3020188) item.Name = “[魂玉]五情七灭阵” item.Color = Color_4 返回 (item) .如果真结束 .如果真 (ItemID = 3020187) item.Name = “[魂玉]捅劲” item.Color = Color_3 返回 (item) .如果真结束 .如果真 (ItemID = 3020183) item.Name = “[魂玉]乾坤日月斩” item.Color = Color_4 返回 (item) .如果真结束 .如果真 (ItemID = 3020179) item.Name = “[魂玉]分水斩” item.Color = Color_3 返回 (item) .如果真结束 .如果真 (ItemID = 3020181) item.Name = “[魂玉]铁马残红” item.Color = Color_3 返回 (item) .如果真结束 .如果真 (ItemID = 3020180) item.Name = “[魂玉]夺魂·双刀” item.Color = Color_3 返回 (item) .如果真结束 .如果真 (ItemID = 3020173) item.Name = “[魂玉]强袭·离火式” item.Color = Color_4 返回 (item) .如果真结束 .如果真 (ItemID = 3020182) item.Name = “[魂玉]易武·万华” item.Color = Color_4 返回 (item) .如果真结束 .如果真 (ItemID = 3020174) item.Name = “[魂玉]五毒酒” item.Color = Color_3 返回 (item) .如果真结束 .如果真 (ItemID = 3020163) item.Name = “[魂玉]流星飞坠” item.Color = Color_3 返回 (item) .如果真结束 .如果真 (ItemID = 3005005) item.Name = “[装备]红甲” item.Color = #红色 返回 (item) .如果真结束 .如果真 (ItemID = 3010053) item.Name = “[道具]锻造锤” item.Color = Color_4 返回 (item)翻译成c++ if源码
最新发布
05-24

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值