有n家银行,每家银行可以抢劫到wi元,被抓的概率是pi,一旦被抓概率到P就有危险了,问最多能抢劫多少钱不陷入危险。
很明显的01背包..dp[i]代表抢劫i元最小被抓的概率...但是计算比较麻烦,可以换一下
dp[i]代表抢劫i元最大不被抓的概率...
#include<bits/stdc++.h>
using namespace std;
#define inf 0x7fffffff
#define ll long long
double dp[11000],p[120];
int w[120];
int main()
{
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
int n;
double P;
int sum=0;
scanf("%lf %d",&P,&n);
for(int i=0;i<n;i++)
{
scanf("%d %lf",&w[i],&p[i]);
sum+=w[i];
}
memset(dp,0,sizeof(dp));
dp[0]=1.0;
for(int i=0;i<n;i++)
{
for(int j=sum;j>=w[i];j--)
{
if(dp[j-w[i]]==0) continue;
dp[j]=max(dp[j],dp[j-w[i]]*(1.0-p[i]));
}
}
for(int i=sum;i>=0;i--)
{
if(P>=(1-dp[i]))
{
printf("Case %d: %d\n",cas,i);
break;
}
}
}
return 0;
}