1 表示已有 0 表示未获得
dp【statu】表示statu状态下的期望
那么在dp【i】的情况下取一个的时候,能取成多种新的状态
dp[i] = 1.0;//要取一个才能成为新的状态
double temp = 0;
for( int j = 0; j < N; j++ ){
if( !( i & ( 1 << j ) ) ){
dp[i] += p[j] * dp[i|(1<<j)];//新的状态的期望*取成该状态的概率
temp += p[j];
}
}
dp[i] /= temp;//除以总概率
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
double dp[1<<20];
double p[20];
int main(){
int N;
while( scanf( "%d", &N ) != EOF ){
for( int i = 0; i < N; i++ ){
scanf( "%lf", &p[i] );
}
dp[(1<<N)-1] = 0;
for( int i = (1<<N) - 2; i >= 0; i-- ){
dp[i] = 1.0;//要取一个才能成为新的状态
double temp = 0;
for( int j = 0; j < N; j++ ){
if( !( i & ( 1 << j ) ) ){
dp[i] += p[j] * dp[i|(1<<j)];//新的状态的期望*取成该状态的概率
temp += p[j];
}
}
dp[i] /= temp;//除以总概率
}
printf( "%lf\n", dp[0] );
}
return 0;
}