题意:某个人去抢银行 但是有一个概率p 如果被抓的概率小于p 它的妈妈才会同意他去抢银行 有n个银行 每个银行的钱和被抓的概率
让你计算他可以在不被抓的情况下抢到的最大money
思路: 简单dp 需要钱的最大数目 就是算出它抢多少钱时候的被抓可能性 如果不被抓 抢到的钱多的话就是这个答案
状态转移方程:dp[j]=max(dp[j],dp[j-money[i]]*(1-p[i]) 可以减去money[i] 说明有足够的钱 抢了i银行 就有不被抓的可能性。 初始化dp[0]=1;
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=101;
const int maxv=10005;
float dp[maxv]; //求最大的不被抓概率
float p; //被抓的概率要<=p
int n;
int sum; //银行的总钱数
int money[maxn];
float prob[maxn];
int main()
{
int t,val;
float pj;
scanf("%d",&t);
while(t--){
scanf("%f%d",&p,&n);
sum=0;
for(int i=1;i<=n;i++){
scanf("%d%f",&val,&pj);
sum+=val;
money[i]=val; //将银行里的钱当成容量
prob[i]=1-pj; //将不被抓的可能性当成价值
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<=n;i++){
for(int j=sum;j>=money[i];j--){
dp[j]=max(dp[j],dp[j-money[i]]*prob[i]);//也就是之前抢劫过money[i] 所以有个不被抓的概率
}
}
int ans=0; //别忘了初始为0
for(int i=sum;i>=1;i--){
if(dp[i]>=1-p){
ans=i;
break;
}
}
printf("%d\n",ans);
}
return 0;
}