这道题目应该在理解上会有一点问题。这道题的概率不是用来加的,而是用来乘的。这道题要的是在能逃跑的前提下,获得的最大money,而题目中给的概率是被抓的概率,所以要先有一个预处理,之后只要列出状态转移方程就可以轻松解决了:dp[i]=max{dp[i],dp[i-v[i]]*p[i]},注意初始条件,dp[0]=1,因为若抢劫金额为0的话,那么逃跑的概率就是1.
#include"iostream"#include"stdio.h"#include"cmath"#include"algorithm"#include"string.h"#define mx 100005using namespace std;double p[mx],dp[mx];int sum[mx],v[mx];double max(double a,double b){ return a>b?a:b;}int main(){ int t,n,i,j; double P; cin>>t; while(t--) { scanf("%lf%d",&P,&n); P=1-P;//最大的逃跑率 sum[0]=0; for(i=1;i<=n;i++) { cin>>v[i]>>p[i]; p[i]=1-p[i];//逃跑的概率 sum[i]=sum[i-1]+v[i]; } memset(dp,0.0,sizeof(dp)); dp[0]=1; for(i=1;i<=n;i++) { for(j=sum[n];j>=v[i];j--) { dp[j]=max(dp[j],dp[j-v[i]]*p[i]); } } for(i=sum[n];i>=1;i--) if(dp[i]>P) break; cout<<