-
E - Robberies
- HDU - 2955
- 思路:背包容量是钱数,银行有限钱数有限的。然后是求最大逃跑概率,而题中每项给出的是被抓概率,所以要先被1减一下。转化为概率的乘积,所以动态方程也要做出改变。最后遍历,剩余的钱数越多,说明所抢的钱数越少,逃跑几率越大。所以从大到小遍历背包容量,一旦大于p,即为最大概率跳出。
-
#include<bits/stdc++.h> using namespace std; #define maxn 10552 int n,t,sum; double dp[maxn],p; struct node { int m0; double p0; } a[maxn]; int main() { cin>>t; while(t--) { memset(dp,0.0,sizeof(dp)); cin>>p>>n; sum=0; for(int i=0; i<n; i++) { cin>>a[i].m0>>a[i].p0; sum+=a[i].m0; } dp[0]=1.0; for(int i=0; i<n; i++) for(int j=sum; j>=a[i].m0; j--) dp[j]=max(dp[j],dp[j-a[i].m0]*(1-a[i].p0)); for(int i=sum; i>=0; i--) { if(1-dp[i]<=p) { cout<<i<<endl; break; } } } return 0; }
E - Robberies -最值型01背包
最新推荐文章于 2020-01-18 10:31:45 发布