分析:01背包的概率问题
当前的概率基于前一种状态的概率,即偷n家银行而不被抓的概率等于偷n-1家银行不被转的概率乘以偷第n家银行不被抓的概率。
用dp[i]表示偷价值为 i 时不被抓的概率,则状态转移方程为:
dp[j] = max(dp[j] , dp[j-m[i]] * (1-p[i]));
自己写关键在01背包的转换,原意是提供银行个数和期望被捕概率,然后将每个银行的钱数和逃脱概率给出,通过将总数当作背包大小,通过求最大逃脱概率当作最大价值(但是并不是求这个),最终通过从总钱数递减找到低于期望被捕概率第一项背包,即为不被逮捕的所能强盗的最大钱数。
#include<stdio.h> struct node { int money; double p; } a[105]; double max(double a,double b) { return a>b? a:b;} int main() { int i,j,t,sum,N; double P; double dp[10005]; scanf("%d",&t); while(t--) { for(i=0;i<10005;i++) dp[i]=0; dp[0]=1; sum=0; scanf("%lf%d",&P,&N); for(i=0;i<N;i++) { scanf("%d%lf",&a[i].money,&a[i].p); sum+=a[i].money; } for(i=0;i<N;i++) for(j=sum;j>=a[i].money;j--) dp[j]=max(dp[j],dp[j-a[i].money]*(1-a[i].p)); for(i=sum;i>=0;i--) { if(dp[i]>1-P) { printf("%d\n",i); break; } } } return 0; }
hdu 2995 Robberies
最新推荐文章于 2020-04-03 15:52:16 发布