题目链接
要理解n个骰子是同时掷出,即最小值的点数是n,最大的点数是6 * n,共有6n种可能
尤其注意最小值是n而不是1,不是将骰子一个接一个掷出去的
for(int i = 2; i <= n; ++i){//n个骰子
for(int j = i; j <= 6 * i; ++j){//n个骰子能组合出来的点数
for(int k = 1; k <= 6; ++k){//当前骰子的点数
if(j - k <= 0){
continue;
}
dp[i][j] += dp[i - 1][j - k];
}
}
}
class Solution {
public:
int dp[15][105];//dp[i][j]表示投掷i个骰子,得到点数j的次数是dp[i][j]
vector<double> dicesProbability(int n) {
vector<double> ans;
//边界
for(int i = 1; i <= 6; ++i){
dp[1][i] = 1;
}
for(int i = 2; i <= n; ++i){//n个骰子
for(int j = i; j <= 6 * i; ++j){//n个骰子能组合出来的点数
for(int k = 1; k <= 6; ++k){//当前骰子的点数
if(j - k <= 0){
continue;
}
dp[i][j] += dp[i - 1][j - k];
}
}
}
int total = pow(6, n);
for(int i = n; i <= 6 * n; ++i){
ans.push_back(dp[n][i] * 1.0 / total);
}
return ans;
}
};