Robberies HDU2955
因为题目涉及求浮点数的计算:则不能从正面使用01背包求解。。。
为了能够使用01背包!从唯一的整数(抢到的钱下手)。。。
之后就是概率的问题:
题目只是给出被抓的几率,如果同时抢两家银行的话,那么被抓的概率是:
(1-一家不被抓的概率*另一家不被抓的概率)
才是同时抢两家被抓的概率!
最后和题目给出的概率比较取较大值。。。
那么赋初值的时候dp[0]=1。
注意:不要误以为精度只有两位。
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 double n,b[105]; 7 double dp[10005]; 8 int a[105]; 9 int main() 10 { 11 int t,m,s,i,j; 12 scanf("%d",&t); 13 while(t--) 14 { 15 scanf("%lf%d",&n,&m); 16 n=1-n; 17 s=0; 18 for(i=0;i<m;i++) 19 { 20 scanf("%d%lf",&a[i],&b[i]); 21 s+=a[i]; 22 b[i]=1-b[i]; 23 } 24 memset(dp,0,sizeof(dp)); 25 dp[0]=1; 26 for(i=0;i<m;i++) 27 for(j=s;j>=a[i];j--) 28 dp[j]=max(dp[j],dp[j-a[i]]*b[i]); 29 for(j=s;j>=0;j--) 30 if(dp[j]-n>0.0000001) 31 break; 32 printf("%d ",j); 33 } 34 return 0; 35 }