假设赌场(C)有一个只涉及一个玩家和一个经销商的游戏。游戏使用m + n张牌,m被标记为获胜牌,'n'被标记为失败牌。
有关游戏的规则/信息:
如果玩家下注'W'金额并且获得了获胜的牌。玩家获得2W的回报,否则他将失去赌注金额
问题:推导出一个应该遵循的算法或策略,以最大化他的利润。
一些例子:
Testcase - 1:
Lets say m=0, n=1
球员知道经销商没有机会但是无论他下注什么都让他失败,所以他下注'0'金额。因此,他能做的最大值是X.
测试用例 - 2:
m=1, n=0
玩家知道经销商别无选择,只能抽出唯一的牌即获胜牌,所以他下注所有内容,即'X',然后回到'2X'。所以,他以2倍的金额退出了赌场。
TestCase - 3:
m=1, n=1 :
让我们说玩家下注'W'金额 - 让我们说经销商绘制获胜卡:因此净金额= X + W且m-> 0且n-> 1:因此在这种情况下X + W的最大金额 - 如果经销商丢失卡:所以净额左= X-W且m-> 1且n-> 0:因此,在这种情况下最大量为2(X-W)
玩家将选择“W”以最大化他的利润,这只能在2(X-W)= X + W =>的情况下进行。 W = X / 3
因此,在这种情况下,玩家可以走出最大数量= 4X / 3
答案 0 :(得分:1)
这是F#
的解决方案建议:除非必须,否则不要进行符号编程。在这种情况下,我们假设X = 1
let stake = Array2D.zeroCreate 100 100
let bankroll = Array2D.zeroCreate 100 100
for i in 1 .. 99 do
stake.[0, i] <- 0.0
bankroll.[0, i] <- 1.0
for i in 1 .. 99 do
stake.[i, 0] <- 1.0
bankroll.[i, 0] <- 2.0
stake.[0, 0] <- 0.0
bankroll.[0, 0] <- 1.0
let rec solve i j =
if bankroll.[i, j] <> 0.0 then (stake.[i, j], bankroll.[i, j])
else
let a = snd (solve (i - 1) j)
let b = snd (solve i (j - 1))
let x = (b - a) / (a + b) // solve (1 + x)a = (1 - x)b
let y = (x + 1.0) * a
stake.[i, j] <- x
bankroll.[i, j] <- y
(x, y)
solve 10 10 // = (0.06182352702, 1.333333333)
只要获胜卡的数量等于丢失卡的数量,玩家可以获得的最大利润总是4倍/ 3