标签:des style http io ar color os sp java
3 0.04 3 1 0.02 2 0.03 3 0.05 0.06 3 2 0.03 2 0.03 3 0.05 0.10 3 1 0.03 2 0.02 3 0.05
2 4 6
题意:给你一个被抓到的概率P和各个银行的信息,银行信息为拥有的钱V和来偷钱被抓的概率,要求的是不被抓到情况下能偷到的钱最多是多少
解析:直接求被抓概率很麻烦,所以换成求不被抓的,那就是每次偷钱都不被抓的概率,这样就方便多了,然后用01背包的做法就可以KO之!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main (void)
{
int t,n,m,i,j,k,l;
double P,p[111],dp[11111];
int v[111];
scanf("%d",&t);
while(t--&&scanf("%lf%d",&P,&n)!=EOF)
{
P=1-P; //换算成不被抓的概率
m=0;
for(i=0;i<n;i++)
{
scanf("%d%lf",&v[i],&p[i]);
p[i]=1-p[i];
m+=v[i]; //求出所有银行的总钱数,因为背包以钱为下标
}
memset(dp,0,sizeof(dp));
dp[0]=1; //偷到钱=0的时候安全概率是1,即还没偷的时候
for(i=0;i<n;i++)
{
for(j=m;j>=v[i];j--)
{
if(dp[j]<dp[j-v[i]]*p[i])
dp[j]=dp[j-v[i]]*p[i];
}
}
while(m>=0) //遍历所有金钱量,这里要记得把0算进来,可能没有偷到任何银行的情况
{
if(dp[m]>=P) //P已经换算成了安全概率,所以只要不被抓的概率大于或者等于它就安全
{
printf("%d\n",m);
break;
}
m--;
}
}
return 0;
}
总结:开始因为是英文题,所以没有好好看,理解成了概率相加小于那个概率p就行了,我想说,能不能给点有建设性的测试数据?这是在考大伙的编程思维还是读题啊!!
标签:des style http io ar color os sp java
原文地址:http://blog.csdn.net/jingdianitnan/article/details/41514603