Robberies(HDU2955):01背包+概率转换问题(思维转换)
2013-08-30 21:38
411 查看
Robberies HDU2955
因为题目涉及求浮点数的计算:则不能从正面使用01背包求解。。。
为了能够使用01背包!从唯一的整数(抢到的钱下手)。。。
之后就是概率的问题:
题目只是给出被抓的几率,如果同时抢两家银行的话,那么被抓的概率是:
(1-一家不被抓的概率*另一家不被抓的概率)
才是同时抢两家被抓的概率!
最后和题目给出的概率比较取较大值。。。
那么赋初值的时候dp[0]=1。
注意:不要误以为精度只有两位。
因为题目涉及求浮点数的计算:则不能从正面使用01背包求解。。。
为了能够使用01背包!从唯一的整数(抢到的钱下手)。。。
之后就是概率的问题:
题目只是给出被抓的几率,如果同时抢两家银行的话,那么被抓的概率是:
(1-一家不被抓的概率*另一家不被抓的概率)
才是同时抢两家被抓的概率!
最后和题目给出的概率比较取较大值。。。
那么赋初值的时候dp[0]=1。
注意:不要误以为精度只有两位。
#include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; double n,b[105]; double dp[10005]; int a[105]; int main() { int t,m,s,i,j; scanf("%d",&t); while(t--) { scanf("%lf%d",&n,&m); n=1-n; s=0; for(i=0;i<m;i++) { scanf("%d%lf",&a[i],&b[i]); s+=a[i]; b[i]=1-b[i]; } memset(dp,0,sizeof(dp)); dp[0]=1; for(i=0;i<m;i++) for(j=s;j>=a[i];j--) dp[j]=max(dp[j],dp[j-a[i]]*b[i]); for(j=s;j>=0;j--) if(dp[j]-n>0.0000001) break; printf("%d\n",j); } return 0; }
相关文章推荐
- Robberies(01背包的概率问题)
- hdu2955-Robberies(01背包 概率 )
- hdu2955 Robberies (01背包概率)
- hdu 2955 Robberies(概率01背包,反向思维)
- HDU 2955 Robberies(01背包的概率问题)
- HDU 2955 Robberies(经典01背包概率问题)
- HDU2955 Robberies(特殊思路,概率背包)
- Robberies(简单的01背包 HDU2955)
- Robberies(简单的01背包 HDU2955)
- HDU 2955 Robberies(01背包+思维)
- hdu2955 Robberies --01背包
- hdu2955 Robberies 01背包
- HDU 1203 I NEED A OFFER!(01背包概率问题)
- 01背包问题的小改--结合概率
- HDU 2955 Robberies……(01背包 + dp存储成功概率(转化),下标存储抢到多少钱,输出下标)
- poj1276 多重背包问题 转换为经典的01背包
- HDU 2955 Robberies (01背包,思路要转换一下,推荐!)
- HDOJ2955 Robberies(01背包,概率)
- hdu 2955 Robberies + LightOJ 1079 Just another Robbery (01背包 概率)
- HDU2955-Robberies-01背包