您的位置:首页 > 其它

HDU 2955

2012-01-17 21:12 148 查看
 其实就是背包。

因为成功逃脱的概率是个double数,所以不可以用概率当做背包的V或者W了。

从m的小范围可以推测出来这时用m为下标比较合适。

#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;

const int maxn=110;
int m[maxn];
double p[maxn];
double f[10001];

int main()
{
freopen("in.txt","r",stdin);
int t;scanf("%d",&t);
while(t--)
{
double p0;
int n,sum=0;
scanf("%lf%d",&p0,&n);
p0=1-p0;
for(int i=1;i<=n;i++){scanf("%d%lf",&m[i],&p[i]);p[i]=1-p[i];sum+=m[i];}
for(int i=0;i<10001;i++)f[i]=0;
f[0]=1;
for(int i=1;i<=n;i++){
for(int j=sum;j>=m[i];j--){
f[j]=max(f[j],f[j-m[i]]*p[i]);
}
}
int maxv=0;
for(int i=0;i<=sum;i++){
if(f[i]>p0)maxv=max(maxv,i);
}
printf("%d\n",maxv);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: