一、bash game(巴什博弈)
一堆n個物品,兩個人輪流從中取出1~m個,最後取光者勝(不能繼續取的人輸)。
1,分析:首先n一定可以表示為:n = k * (m + 1) + r (0 <= r <= m);
;二、wythoff game(威佐夫博弈)有兩堆各若干物品,兩個人輪流從任意一堆中至少取出乙個或者從兩堆中取出同樣多的物品,規定每次至少取乙個,至多不限,最後取光者勝。
1,分析:
所以,先求出差值,差值***分割比 == 最小值的話後手贏,否者先手贏。
2,**:
double r =
(sqrt(5
)+1)
/2;int d =
abs(a - b)
* r;
if(d !=
min(a, b)
)return
true
;else
false
;
三、fibonacci nim game(斐波那契博弈)
一堆石子有n個,兩人輪流取,先取者第一次可以去任意多個,但是不能取完,以後每次取的石子數不能超過上次取子數的2倍。取完者勝。
1,分析:規律:先手獲勝條件:n不是斐波那契數。證明:根據「zeckendorf定理」(齊肯多夫定理):任何正整數可以表示為若干個不連續的fibonacci數之和。然後再用反證法或者第一數學歸納法應該都是可以證明的。這裡就不證明了。
2,**
f[0]
= f[1]
=1;for
(int i =
2; f[i -1]
< n; i++
)return
true
;
四、尼姆博弈有n堆物品,兩人輪流取,每次取某堆中不少於1個,最後取完者勝。
假如有3堆物品(a,b,c)
(0,0,0)狀態時先手是乙個必輸局勢因為沒有東西可取,(0,n,n) 狀態時也是必輸局勢只要後者在另一堆取得物品與前者一樣多時那麼前者也就是必輸局勢。慢分析(1,2,3)也是乙個必輸局勢。如果我們將其轉化為二進位制形式並通過異或運算(^)我們會發現:
000100100011=0000
通過驗證所有的堆數量累^後只要為0就都是必輸局勢,所以我們就只要記住這個
規律:將n堆物品數量全部異或後結果為0先手必敗,否則必勝。
2,**
int res =0;
for(
int i =
1; i <= n; i++
) res ^
= arr[i];if
(res)
return
true
;else
return
false
;
但是,實際問題中不可能給出如此標準的博弈模型,對於更加一般的博弈問題,我們該如何求解呢?通過sg函式轉換為尼姆博弈。五、sg函式博弈論sg函式 ACM博弈論基礎
博弈論的題目有如下特點 有兩名選手 兩名選手交替操作,每次一步,每步都在有限的合法集合中選取一種進行 在任何情況下,合法操作只取決於情況本身,與選手無關 遊戲敗北的條件為 當某位選手需要進行操作時,當前沒有任何可以執行的合法操作 下面介紹幾個經典的博弈。一堆n個物品,兩個人輪流從中取出1 m個,最後...
ACM博弈論總結
常用的4個博弈論演算法 巴什博奕,威佐夫博奕,尼姆博奕,斐波那契博弈 只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取乙個,最多取m個。最後取光者得勝。顯然,如果n m 1,那麼由於一次最多只能取m個,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝。因此我們發現了如...
博弈論基礎
模型 一堆n個物品,兩個人輪流從這堆物品中取物。規定每次至少取乙個,最多取m個,最後取光者得勝。hdu 1846 int n,m intmain return0 luogu t115850 nanako s game int main return0 模型 一堆物品,最後操作者勝。操作規則 1 第一...