hdu4815 (概率DP)

来源:互联网 发布:乐视电视连不上网络 编辑:程序博客网 时间:2024/05/22 15:36

由于没有专门练过概率DP , 场上硬推的,由于一点小失误WA了两发 。

我们很容易求出来d[i][j],表示前i道题,得分为j的概率 。 这样,最终打完所有题目之后猴子得任意分数的概率我们就知道了,老虎要想赢就要至少得和他一样的分数,那么就很好办了,从0~max分,不断相加概率,当概率大于P时的分数就是答案 。

细节见代码:

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 50;const double INF = 10000000.0;int T,n,a[maxn];double p,d[50][40000+100];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]; }        memset(d,0,sizeof(d));        d[0][0] = 1.0;        for(int i=1;i<=n;i++) {            for(int j=0;j<=sum;j++) {                if(j >= a[i]) d[i][j] += d[i-1][j-a[i]]/2;                                    d[i][j] += d[i-1][j]/2;            }        }        int ans;        double pp = 0.0;        for(int i=0;i<=sum;i++) {            pp += d[n][i];            if(pp > p || fabs(pp-p) < 1e-6) { ans = i ; break; }        }        printf("%d\n",ans);    }    return 0;}


1 0
原创粉丝点击