HDOJ 2955 Robberies 简单01背包+简单概率思想
来源:互联网 发布:php v phpinfo 编辑:程序博客网 时间:2024/06/11 20:22
/*** 与其说这题考背包,不如说考概率。* 比较容易想到的是,把被抓到的概率乘100,加卡精度来做背包容量,钱就做背包价值* 可是不行! 这精度卡不了诶。。还是wa* 换种想法,题目给出的被抓的概率p,那(1-p)就是不被抓的概率。* 然而,让dp[i]表示抢到i百万的逃跑成功率。 那么如何计算?* 如果要抢到i百万需要抢n个银行,那么就是抢这n个银行的逃跑成功率的乘积。 为什么?* 概率知识吧,因为n个银行都必须成功且又是独立的事件,所以根据乘法原理就那样了。。 贴人代码吧*/#include<stdio.h>#include<string.h>double dp[10000];int mm[1000];double pp[1000];double max(double a, double b){ return a>b? a:b;}int main(){ int cas,n,i,j,sum; double p; scanf("%d",&cas); while(cas--) { scanf("%lf %d",&p,&n); for(i=0,sum=0; i<n; i++) { scanf("%d %lf",&mm[i],&pp[i]); sum += mm[i]; } memset(dp,0,sizeof(dp)); dp[0] = 1; for(i=0; i<n; i++) for(j=sum; j>=mm[i]; j--) dp[j] = max(dp[j],dp[j-mm[i]] * (1-pp[i])); for(i=sum; i>=0; i--) { if(dp[i]>=(1-p)) { printf("%d\n",i); break; } } } return 0;}