题目
题意:给出n篇论文,在这n篇论文中选取s篇使得期望最大
思路:将所有论文的通过率排逆序,然后选取前s篇判断前s篇的期望,最后求最大值
状态转移方程:
dp[i][j]=dp[i-1][j-1]*p[i]+dp[i-1][j]*(1.0-p[i]);
AC代码:
package 练习;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.*;
public class M {
static Scanner scanner=new Scanner(System.in);
static Double p[];
static double dp[][]=new double[105][105];
public static void main(String[] args) {
int n=scanner.nextInt();
p=new Double [n+1];
p[0]=Double.MAX_VALUE;
for(int i=1;i<=n;i++)p[i]=scanner.nextDouble()/100;
Arrays.sort(p,Collections.reverseOrder());
dp[0][0]=1;
for(int i=1;i<=n;i++) {//计算i篇中过j篇
dp[i][0]=dp[i-1][0]*(1.0-p[i]);
for(int j=1;j<=i;j++){//
if(j!=i) dp[i][j]=dp[i-1][j-1]*p[i]+dp[i-1][j]*(1.0-p[i]);
else dp[i][j]=dp[i-1][j-1]*p[i];
}
}
double res=0;
for(int i=1;i<=n;i++){
double ans=0;
for(int j=1;j<=i;j++)
ans=ans+dp[i][j]*Math.pow(j*1.0,j*1.0/i);
res=Math.max(res,ans);
}
System.out.println(res);
}
}