题意
给你一个人被抓最大概率和n个银行,每个银行有被抓概率与钱问你在不被抓的情况下得到的金钱最大值
思路
会想到把最大被抓概率当作背包容量,然后每个银行的被抓概率当作花费,钱当做价值。但是这种想法是错误的首先概率的相加就不对,其次对于小数无法用数组来表示。这题的正确思路应该是:把金钱当作花费,把概率当作价值,那么dp[i][j]表示:当金钱为i时不被抓的最大概率。dp[i][j]=max(dp[i][j],dp[i][j-w]*(1-p)),然后再逆序遍历输出就可以
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
double dp[55555];
int c[55555];
double w[55555];
int main()
{
int T;cin>>T;
while(T--)
{
double v;
int n;
cin>>v>>n;
int sum=0;
for(int i=0;i<n;i++)
{
cin>>c[i]>>w[i];
sum+=c[i];
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=0;i<n;i++)
{
for(int j=sum;j>=c[i];j--)
{
dp[j]=max(dp[j]*1.0,dp[j-c[i]]*(1-w[i]));
}
}
for(int i=sum;i>=0;i--)
{
if(dp[i]>(1-v))
{
printf("%d\n",i);
break;
}
}
}
return 0;
}