知识点:01背包的概率问题
当前的概率基于前一种状态的概率,即偷n家银行而不被抓的概率等于偷n-1家银行不被抓的概率乘以偷第n家银行不被抓的概率。
用dp[i]表示偷价值为i时不被抓的概率,则状态转移方程为:dp[i]=max(dp[i],dp[i-m]*(1-p))。
#include <cstdio>
#include <memory.h>
double dp[10001];
int sum;
inline double max(double a,double b)
{
return a>b ? a : b;
}
void ZeroOnePack(int m,double p)
{
for(int i=sum;i>=m;i--)
dp[i]=max(dp[i],dp[i-m]*(1-p));
}
int main()
{
int t,n,m[100];
double p[100],P;
scanf("%d",&t);
while(t--)
{
scanf("%lf%d",&P,&n);
sum=0;
for(int i=0;i<n;i++)
{
scanf("%d%lf",&m[i],&p[i]);
sum+=m[i];
}
memset(dp,0,sizeof(dp)),dp[0]=1;
for(int i=0;i<n;i++)
ZeroOnePack(m[i],p[i]);
int i;
for(i=sum;i>=0&&1-dp[i]>P;i--);
printf("%d\n",i);
}
return 0;
}
![](http://hi.csdn.net/attachment/201111/10/0_1320899842XDNd.gif)