海盜分金問題:有五個海盜刀诬,劫掠了100兩金子,需要分 贓邪财。辦法是抓鬮陕壹,盜亦有道。抓到第一個鬮的人树埠,可以先提出一個分 配方案糠馆,如果他的方案被一半以上的人同意, 就照他的方案分金子怎憋,否則又碌,第一個人就要 被殺掉。余下的人也照此辦理绊袋。我們的問題是:如果你是第一個人毕匀,你 會提出怎樣的分配方案?為了分析問題更確定癌别,我們假定每個人 都是追求自己利益極大化的人皂岔。
with a as
(
select cast(help_topic_id as SIGNED) as n from mysql.help_topic where help_topic_id <101 order by help_topic_id desc
)
, max1 as
(
select max(n) as max1 from a
)
,max2 as
(
select
p2.n as max2,p1.n as max1 from a p1,a p2
where p1.n + p2.n = 100
and p1.n >=(select max1 from max1)
)
,max3 as
(
select/*+ JOIN_ORDER(P3,P2,P1)
JOIN_SUFFIX(P1)
NO_BNL() */
p3.n as max3,p2.n as max2,p1.n as max1 from a p1,a p2,a p3,max2
where p1.n+p2.n+p3.n = 100
and p3.n +p2.n <= 100
and sign(p2.n- max2) + sign(p1.n - max1) >=0
limit 1
)
,max4 as
(
select
/*+ JOIN_ORDER(p4,P3,P2,P1)
JOIN_SUFFIX(P1)
NO_BNL() */
p4.n as max4,p3.n as max3,p2.n as max2,p1.n as max1
from a p1,a p2 ,a p3,a p4,max3
where p1.n+p2.n+p3.n + p4.n = 100
and p4.n + p3.n +p2.n <= 100
and sign(p3.n - max3) + sign(p2.n - max2) + sign(p1.n - max1) >0
limit 1
)
,max5 as
(
select
/*+ JOIN_ORDER(p5,p4,P3,P2,P1)
JOIN_SUFFIX(P1)
NO_BNL() */
p5.n as max5,p4.n as max4,p3.n as max3,p2.n as max2,p1.n as max1
from a p1,a p2 ,a p3,a p4,a p5,max4
where p1.n+p2.n+p3.n + p4.n + p5.n = 100
and p5.n + p4.n + p3.n +p2.n <=100
and sign(p4.n - max4) + sign(p3.n - max3) + sign(p2.n - max2) + sign(p1.n - max1) >=0
limit 1
)
SELECT * FROM MAX5
max5 max4 max3 max2 max1
97 0 1 0 2