很容易推导出转移方程
class Solution {
public:
double probabilityOfHeads(vector<double>& prob, int target) {
// 01背包问题,每个硬币要么正面向上,要么反面向上
int n = prob.size();
// dp[i][j] 表示前i个硬币, 正面向上等于j的概率:
// dp[i][j] = dp[i-1][j-1]*prob[i]+dp[i-1][j]*(1-prob[i])
vector<vector<double>> dp(n+1,vector<double>(target+1));
dp[0][0] = 1;
for(int i=1;i<=n;i++){
for(int j=0;j<=target;j++){
if(j) dp[i][j]=dp[i-1][j-1]*prob[i-1]+dp[i-1][j]*(1-prob[i-1]);
else dp[i][j]=dp[i-1][j]*(1-prob[i-1]);
}
}
return dp[n][target];
}
};