博弈論入門

2021-08-29 12:22:05 字數 2716 閱讀 7258

參考:三個簡單的博弈論問題  博弈

1066 bash遊戲

原題傳送

有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次最少拿1顆,最多拿k顆,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n和k,問最後誰能贏得比賽。

例如n = 3,k = 2。無論a如何拿,b都可以拿到最後1顆石子。

解法:

對於先手來說

基礎:1~m是必贏局面,m+1是必輸局面

遞推:m+2~2m+1是必贏局面,2m+2是必輸局面

...推廣:k(m+1)是必輸局面 (k=0,1,2....),其他為必贏局面

ac**:

#include#include#include#includeusing namespace std;

int n,m,t;

int main()

return 0;

}/* 對於先手來說

基礎:1~m是必贏局面,m+1是必輸局面

遞推:m+2~2m+1是必贏局面,2m+2是必輸局面

...推廣:k(m+1)是必輸局面 (k=0,1,2....),其他為必贏局面

題目:有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次最少拿1顆,最多拿k顆,

拿到最後1顆石子的人獲勝。*/

1069 nim遊戲

原題傳送

有n堆石子。a b兩個人輪流拿,a先拿。每次只能從一堆中取若干個,可將一堆全取走,但不可不取,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n及每堆石子的數量,問最後誰能贏得比賽。

例如:3堆石子,每堆1顆。a拿1顆,b拿1顆,此時還剩1堆,所以a可以拿到最後1顆石子。

(沒看懂的)規律

ac**:

#include#include#include#includeusing namespace std;

int n,x;

int main()

//tag為0則為後手贏,否則為先手贏

printf("%c\n",tag==0?'b':'a');

return 0;

}//題目:有n堆石子。a b兩個人輪流拿,a先拿。每次只能從一堆中

//取若干個,可將一堆全取走,但不可不取,拿到最後1顆石子的人獲勝。

1072 威佐夫遊戲

原題傳送

有2堆石子。a b兩個人輪流拿,a先拿。每次可以從一堆中取任意個或從2堆中取相同數量的石子,但不可不取。拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出2堆石子的數量,問最後誰能贏得比賽。

例如:2堆石子分別為3顆和5顆。那麼不論a怎樣拿,b都有對應的方法拿到最後1顆。

規律:參考

先手必輸時,第乙個值(兩個數中小的那個)=兩數差值* φ   **比例是φ=1.618033......,即為:1+sqrt(5))/2.0(比較關係時要強制轉換成int型)

ac**:

#include#include#include#includeusing namespace std;

int t,a,b;

int main()

d=b-a;//**比例是φ=1.618033,即為:1+sqrt(5))/2.0

k=(int)(d*(1+sqrt(5))/2.0);

//如果a==k,則為後手贏,否則先手贏(奇異局)

printf("%s\n",a==k?"b":"a");

}return 0;

}/*規律:先手必輸時,第乙個值(兩個數中小的那個)=兩數差值* φ

題目:有2堆石子。a b兩個人輪流拿,a先拿。每次可以從一堆中取任意個

或從2堆中取相同數量的石子,但不可不取。拿到最後1顆石子的人獲勝*/

n值太大,無法直接計算,用手動乘法模擬計算,將0.618033988749894848204586834... 分成三部分拆成整數放進陣列

原題傳送

ac**

#include#include#include#include#define ll long long

using namespace std;

拆成整數放進陣列裡,

//拆成三部分即可

ll tmp[3]=;

ll mod=1e9;

int t;

ll a,b;

int main()

ll diff=b-a;

//把10^18分成兩部分10^9

ll ta=diff/mod;

ll tb=diff%mod;

ll tp=tb*tmp[2];

tp=ta*tmp[2]+tb*tmp[1]+tp/mod;

tp=ta*tmp[1]+tb*tmp[0]+tp/mod;

tp=ta*tmp[0]+tp/mod+diff;

if(tp == a)

printf("b\n");

else

printf("a\n");

}return 0;

}

博弈論入門

博弈論 是二人或多人在平等的對局中各自利用對方的策略變換自己的對抗策略,達到取勝目標的理論。博弈論是研究互動決策的理論。博弈可以分析自己與對手的利弊關係,從而確立自己在博弈中的優勢,因此有不少博弈理論,可以幫助對弈者分析局勢,從而採取相應策略,最終達到取勝的目的。一.bash博弈 問題 只有一堆n個...

博弈論入門

什麼是博弈 通俗地講,博弈就是指遊戲中的一種選擇策略的研究。博弈的英文為 game 我們一般將它翻譯成 遊戲 而在英語中,game 的意義不同於漢語中的遊戲,它是人們遵循一定規則的活動,進行活動的人的目的是讓自己 贏 我們在和對手競賽或遊戲的時候怎樣使自己贏呢?這不但要考慮自己的策略,還要考慮其他人...

博弈論入門

斐波那契博弈 fibonacci s game 威佐夫博弈 wythoff game 尼姆博弈 nimm game 畫p n分析 簡單學了博弈論,推導難度大。先了解了幾個經典的博弈論和p n分析法。sg函式,打算後面再學。博弈論 是二人或多人在平等的對局中各自利用對方的策略變換自己的對抗策略,達到取...