题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955
思路:注意p和m[i]是被抓的概率,不能直接用,要转换为逃跑的概率,然后将得到的钱视为背包体积再求解。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; double p,vol[120],dp[12000]; int n,t,cost[120]; int main(void) { int i,j,sum; cin>>t; while(t--) { memset(dp,0,sizeof(dp)); sum=0; dp[0]=1; cin>>p>>n; p=1.0-p; for(i=0;i<n;i++) cin>>cost[i]>>vol[i],sum+=cost[i],vol[i]=1.0-vol[i]; for(i=0;i<n;i++) { for(j=sum;j>=cost[i];j--) dp[j]=max(dp[j],dp[j-cost[i]]*vol[i]); } for(i=sum;i>=0;i--) { if(dp[i]>=p) break; } cout<<i<<endl; } return 0; }