Light OJ 1079 Just another Robbery (概率+背包)

来源:互联网 发布:知乎书店 编辑:程序博客网 时间:2024/05/27 14:13

解析:

dp[i][j]为考虑前i个银行,获得j元,不被逮捕的最大概率。

状态转移方程:dp[i][j] = max(dp[i-1][j],dp[i-1][j-a[i]]*(1-p[i]));

[code]:

#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>using namespace std;const double eps = 1e-7;int n,a[105];double m,dp[10005],p[105];// dp[i][j] = max(dp[i-1][j],dp[i-1][j-a[i]]*(1-p[i]));int main(){    int i,j,cas,T;    scanf("%d",&cas);    for(T = 1;T <= cas;T++){        scanf("%lf%d",&m,&n);        int sum = 0;        for(i = 0;i < n;i++){            scanf("%d%lf",&a[i],&p[i]);            sum += a[i];        }        memset(dp,0,sizeof(dp));        dp[0] = 1;        for(i = 0;i < n;i++){            for(j = sum;j >= a[i];j--)                dp[j] = max(dp[j],dp[j-a[i]]*(1-p[i]));        }        int ans;        for(j = sum;j >= 0;j--)            if(dp[j]>1-m||fabs(1-m-dp[j])<eps){                ans = j;                break;            }        printf("Case %d: %d\n",T,ans);    }    return 0;}


0 0