Just another Robbery
题意:给出Harry可以抢劫的银行数n,和被抓到的概率p,求在Harry不被抓到的情况下,他最多能够抢多少钱
解题思路:dp[j] 代表抢劫到 j 元钱,逃跑的概率,dp[j] = max( ( dp[j - m[i]] ) * p[i])
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <vector>
#include <set>
#include <bitset>
#include <stack>
#include <map>
#include <climits>
#include <functional>
using namespace std;
#define LL long long
const int INF=0x3f3f3f3f;
const double eps=1e-8;
double p;
int n;
int money[105];
double caught[105],dp[10005];
int main()
{
int t,cas=0;
scanf("%d",&t);
while(t--)
{
int sum=0;
scanf("%lf%d",&p,&n);
sum=0;
for (int i=1; i<=n; i++)
{
scanf("%d%lf",&money[i],&caught[i]);
sum+=money[i];
}
for(int i=0;i<=sum;i++) dp[i]=0;
dp[0]=1.0;
for (int i = 1; i <= n; i++)
{
for (int j=sum; j>=money[i]; j--)
dp[j] = max(dp[j], dp[j-money[i]]*(1-caught[i]));
}
for(int i = sum; i >= 0; i--)
{
if (p>=1.0-dp[i])
{
printf("Case %d: %d\n",++cas, i);
break;
}
}
}
return 0;
}