题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955
分析:被抓概率可以转换成安全概率,Roy的安全概率大于1-P时都是安全的。
抢劫的金额为0时,肯定是安全的,所以dp[0]=1;其他金额初始为最危险的所以概率全为0;
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <vector> #include <set> #include <map> #define LL long long #define inf 1<<30 using namespace std; int c[110]; int n; double p,dp[10010],w[110]; int main() { int T; scanf("%d",&T); while(T--) { scanf("%lf%d",&p,&n);p=1-p; int sum=0; for(int i=1;i<=n;i++) { scanf("%d%lf",&c[i],&w[i]); sum+=c[i];w[i]=1-w[i]; } memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1;i<=n;i++) for(int j=sum;j>=c[i];j--) dp[j]=max(dp[j],dp[j-c[i]]*w[i]); for(int i=sum;i>=0;i--) if(dp[i]>p) { printf("%d\n",i); break; } } }