题意:
给你两个数n和p,然后一个大小为n的数组a[],
你和一个机器人答题竞赛,n个题目,第i个题目答对可得ai的分数,假设机器人答对每一题的概率都是0.5
求:你最少需要得到多少分,使得你赢的概率大于等于P
解法:设方程表示为,机器人在前 i 个题目中共得 j 分数的方案数,
那么n个题目,机器人获取 j 分数的概率为:
那么你获得 x 分数,赢的概率为:
枚举x使得概率大于等于p,即可
#include<bits/stdc++.h> #define ll long long using namespace std; int t; int n; double p; int a[50]; ll dp[50][40004]; int main() { scanf("%d",&t); while(t--) { scanf("%d%lf",&n,&p); ll SUM=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); SUM+=a[i]; } for(int i=0;i<=n;i++) { for(int j=0;j<=SUM;j++) { dp[i][j]=0; } } dp[0][0]=1; for(int i=1;i<=n;i++) { for(int j=0;j<=SUM;j++) { if(j-a[i]>=0) dp[i][j]+=dp[i-1][j-a[i]]; dp[i][j]+=dp[i-1][j]; } } double kao=1; for(int i=0;i<n;i++) { kao*=0.5; } double sum=0; for(int j=0;j<=SUM;j++) { sum+=dp[n][j]; if(sum*kao>=p) { printf("%d\n",j); break; } } } }
Little Tiger vs. Deep Monkey DP
最新推荐文章于 2021-03-17 10:51:19 发布