这题实际上是一个01背包问题。开始的时候把被抓的概率作为花费乘以100、1000甚至1000000来运算,结果不是wa就是tle。。。。
后来上网看了题解,发现这是很巧妙的01背包问题。解决问题的时候是要把不被抓到的概率作为价值,而抢到的钱作为花费,求出在安全概率最高的情况下所抢到的钱。
以下是实现代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int N=110;
const int M=100001;
double safety[N],bag[M];
int money[N];
int sum,n;
void beibao()
{
int i,j;
for(i=0;i<=sum;i++)
bag[i]=0.0;
bag[0]=1.0;
for(i=1;i<=n;i++)
for(j=sum;j>=money[i];j--)
{
bag[j]=bag[j]>(bag[j-money[i]]*safety[i])?bag[j]:(bag[j-money[i]]*safety[i]);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
double p;
scanf("%lf%d",&p,&n);
int i,j;
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d%lf",&money[i],&safety[i]);
safety[i]=1.0-safety[i];
sum+=money[i];
}
beibao();
p=1.0-p;
for(i=sum;bag[i]<p;i--);
printf("%d/n",i);
}
return 0;
}