方法一:
class Solution {
public double soupServings(int n) {
n = (int) Math.ceil((double) n / 25);
// 当n很大的时候,汤B先被分配完的概率基本为0
if (n >= 179) {
return 1.0;
}
double[][] dp = new double[n + 1][n + 1];
// 汤A和汤B同时分配完的dp为0.5
dp[0][0] = 0.5;
// 将汤A先被分配完的dp都设置为1
for (int i = 1; i <= n; i++) {
dp[0][i] = 1.0;
}
// 从1开始,若i为0则汤A已经被分配完,dp值为1
for (int i = 1; i <= n; i++) {
// 从1开始,若j为0则汤B已经被分配完,dp值为0
for (int j = 1; j <= n; j++) {
dp[i][j] = (dp[Math.max(0, i - 4)][j] + dp[Math.max(0, i - 3)][Math.max(0, j - 1)] + dp[Math.max(0, i - 2)][Math.max(0, j - 2)] + dp[Math.max(0, i - 1)][Math.max(0, j - 3)]) / 4.0;
}
}
return dp[n][n];
}
}