用python做下题 提目:抓糖豆,小Q与小K都喜欢吃糖豆。 但是糖豆分两种,超甜糖豆和普通糖豆。 现在有w个超甜糖豆和b个普通糖豆。 小Q和小K开始吃糖豆,他们决定谁先吃到超甜糖豆谁就获胜。 小K每次吃的时候会捏碎一颗糖豆。 小Q先吃,小Q想知道自己获胜的概率。 如果两个人都吃不到超甜糖豆小K获胜。 输入描述:输入两个整数w,b。(0<=w,b<=1000) 输出描述:答案保留9位小数。
时间: 2024-04-15 11:29:01 浏览: 57
这是一个经典的动态规划问题,可以使用递归和记忆化搜索来解决。定义一个函数`win_probability(w, b)`,表示在有w个超甜糖豆和b个普通糖豆的情况下,小Q获胜的概率。
根据题目要求,如果超甜糖豆数量为0,小Q必输,概率为0。如果超甜糖豆数量大于0,小Q有两种选择:
1. 小Q吃一个超甜糖豆,变成有w-1个超甜糖豆和b个普通糖豆的情况。此时轮到小K先吃,小Q的获胜概率为`win_probability(w-1, b)`。
2. 小Q吃一个普通糖豆,变成有w个超甜糖豆和b-1个普通糖豆的情况。此时轮到小K先吃,小Q的获胜概率为`win_probability(w, b-1)`。
综上所述,可以得到递归的表达式:`win_probability(w, b) = w / (w + b) + (b / (w + b)) * win_probability(w, b-1)`。
为了避免重复计算,可以使用一个字典来保存中间结果。具体代码实现如下:
```python
def win_probability(w, b, memo={}):
if w == 0:
return 0.0
if b == 0:
return 1.0
if (w, b) in memo:
return memo[(w, b)]
total = w + b
probability = w / total + (b / total) * win_probability(w, b-1)
memo[(w, b)] = probability
return probability
w, b = map(int, input().split())
result = win_probability(w, b)
print("{:.9f}".format(result))
```
注意,在递归函数中,首先检查是否已经计算过当前情况的结果,如果是则直接返回,避免重复计算。同时,为了保证输出精度,使用`"{:.9f}".format(result)`将结果保留9位小数。
希望对你有所帮助!
阅读全文