//dp[i]保存盗取i的钱时不被抓的最大概率
//dp[i]=max(dp[i],dp[i-W[j]]*P[j]),W[j]表示这家银行所拥有的的钱,P[j]表示在这家银行不被抓的概率
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 107;
int D[maxn];
double B[maxn];
double dp[maxn * 100];//dp[i]定义为得到i的钱时的最高生存概率
bool vis[maxn * 100];
int main()
{
int T;
cin >> T;
while (T--)
{
memset(vis, 0, sizeof(vis));
for (int i = 0; i < maxn * 100; i++)
{
dp[i] = 0.0;
}
double P;
int N;
cin >> P >> N;
P = 1 - P;
double p;
for (int i = 1; i <= N; i++)
{
cin >> D[i] >> p;
B[i] = 1 - p;
}
dp[0] = 1;
vis[0] = 1;
int maxloc = 0;
for (int i = 1; i <= N; i++)
{
for (int j = maxloc; j >= 0; j--)
{
if (vis[j])
{
int k = j + D[i];
maxloc = max(k, maxloc);
vis[k] = 1;
dp[k] = max(dp[k], dp[j] * B[i]);
}
}
}
int ans = 0;
for (int i = maxloc; i >=0; i--)
{
if (vis[i] && dp[i] >= P)
{
ans = i;
break;
}
}
cout << ans << endl;
}
return 0;;
}
hdu2955 概率dp
最新推荐文章于 2019-10-25 00:06:12 发布