http://acm.hdu.edu.cn/showproblem.php?pid=2955
题目大意:
有一个小偷想要偷银行里面的钱,但是他每偷一家银行都有被抓的概率,现在给一个概率p,
只要他被抓的概率小于p,那小偷就是安全的,在安全的情况下,小偷能偷走的钱最多是多少。。
本来这道题是想要小偷逃跑率来看成是背包的体积的,但是概率是浮点型的,不好操作。。
所以我们就用银行总的钱来看成是体积,安全概率为价值,所以就这样做咯
我的代码:
#include <iostream>
#include <cstdio>
#include<cstring>
using namespace std;
int w[105];
double v[105];
double dp[100005];
int max(int a,int b)//这些可以不写的
{
if(a>b)
return a;
else
return b;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
double m1;
int n,i;
scanf("%lf %d",&m1,&n);
double m=1-m1;
int sum=0;
for(i=1;i<=n;i++)
{
scanf("%d%lf",&w[i],&v[i]);
v[i]=1-v[i];
sum+=w[i];
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for(i=1;i<=n;i++)
{
int j;
for(j=sum;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-w[i]]*v[i]);//小偷最大逃跑率
}
}
for(i=sum;i>=0;i--)
{
if(dp[i]>=m)
break;
}
printf("%d\n",i);
}
return 0;
}