Description
As a smart boy, you notice that to win the award, you must buy much more snacks than it seems to be. To convince your friends not to waste money any more, you should find the expected number of snacks one should buy to collect a full suit of cards.
Input
Note there is at most one card in a bag of snacks. And it is possible that there is nothing in the bag.
Output
You will get accepted if the difference between your answer and the standard answer is no more that 10^-4.
Sample Input
思路:狀態壓縮,從後往前推;
f [ s ]=1+f [ s ]*(1-segma[p. i ] ) + f[s]*segma[p. j ] + f[s|1<<k ]*segma[p.k] ;
代碼:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#define INF 0x7fffffff
#define SUP 0x80000000
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const int N=100007;
double a[30],dp[5000000];
int main()
{
int n;
while(scanf("%d",&n)==1)
{
double tt=0,sum;
for(int i=0;i<n;i++)
{
scanf("%lf",a+i);
tt+=a[i];
}
tt=1-tt; //空包的概率
dp[(1<<n)-1]=0;
for(int i=(1<<n)-1-1;i>=0;i--)
{
dp[i]=1;
sum=0;
for(int j=0;j<n;j++)
{
if(i&1<<j) sum+=a[j];
else dp[i]+=dp[i|1<<j]*a[j];
}
dp[i]/=1-tt-sum;
}
printf("%.4f\n",dp[0]);
}
return 0;
}