hdu 2955 Robberies 01背包
http://acm.hdu.edu.cn/showproblem.php?pid=2955
01背包的变形,才开始我就是按这别人说的脑残的办法将概率扩大100000被后计算,概率连续着加。。一直wa中。。无语 啊。
最后原来是概率要连成乘的啊。。而且这里把抢劫的钱作为背包体积,V等于抢劫抢得最多的钱,然后直接套用01背包。。
View Code
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
double f[99999],p[107];
int c[107];
int main()
{
int t,i,j,n,sum;
double pk;
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%lf%d",&pk,&n);
for(i=0;i<n;i++)
{
scanf("%d%lf",&c[i],&p[i]);
sum+=c[i];
p[i]=1-p[i];
}
memset(f,0,sizeof(f));
f[0]=1;
for(i=0;i<n;i++)
{
for(j=sum;j>=c[i];j--)
{
f[j]=max(f[j],f[j-c[i]]*p[i]);
}
}
for(i=sum;i>=0;i--)
{
if(1-f[i]<pk)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}



浙公网安备 33010602011771号