#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=16,M=1<<N;
int n,k;
double p[N],f[M][N*5+1];
double dfs(int x,int sum,int need){
if(f[x][sum]>=0)return f[x][sum];
if(sum>=need*k)return f[x][sum]=0;
f[x][sum]=0;
for(int i=0;i<n;i++){
if(x>>i&1)f[x][sum]+=p[i]*(dfs(x,sum+1,need)+1);
else f[x][sum]+=p[i]*(dfs(x^(1<<i),sum,need-1)+1);
}
return f[x][sum];
}
signed main(){
cin>>n>>k;
for(int i=0;i<n;i++)cin>>p[i];
memset(f,-1,sizeof f);
cout<<dfs(0,0,n);
}
期望dp
用状态压缩+记忆化搜索
这道题不是求达到这个状态的最大值最小值,而是求达到这个状态的确切数值
只要你能把状态划分好,怎么写dfs都是对的