2022.3.7练习 CSP 202109-4 收集卡牌
参考博客:CSP 202109-4 收集卡牌题解
#include<bits/stdc++.h>
using namespace std;
double p[17];
double dp[1<<17][100];
int cnt[1<<17];
int main()
{
std::ios::sync_with_stdio(false);
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>p[i];
for(int i=0;i<(1<<17);i++)
{
int x=i;
while(x)
{
x&=x-1;
cnt[i]++;
}
}
dp[0][0]=1;
double ans=0;
for(int s=0;s<(1<<17);s++)
{
for(int i=0;i<=100;i++)
{
if(cnt[s]+(i-cnt[s])/k==n)
{
ans+=i*dp[s][i];
continue;
}
for(int j=0;j<n;j++)
{
if(s&(1<<j))
dp[s][i+1]+=dp[s][i]*p[j];
else
dp[s+(1<<j)][i+1]+=dp[s][i]*p[j];
}
}
}
cout<<setiosflags(ios::fixed)<<setprecision(10)<<ans;
return 0;
}