您的位置:首页 > 其它

hdu2955 01背包

2016-03-15 23:06 190 查看
题意:一个强盗要去抢劫银行,对于每个银行来说,都有一个不被抓的概率p,和能抢劫到的钱数money,每个银行最多只可以被抢劫一次。问在不被抓的总概率P下,怎样得到最大价值的钱数;

思路:最大的难点是因为存在小数,思路要转换,可以将所用银行里的钱看作背包容量,每一家银行的钱看作重量,不被抓到的概率看作价值

代码:

#include<stdio.h>
#include<string.h>
int a[10001];
double b[10001];
double dp[10001];
double max(double x,double y)
{
return x>y?x:y;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i,j,k,sum;
double p;
sum=0;
scanf("%lf%d",&p,&k);
p=1-p;
for(i=1;i<=k;i++)
{
scanf("%d%lf",&a[i],&b[i]);
sum+=a[i];
b[i]=1-b[i];
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for(i=1;i<=k;i++)
for(j=sum;j>=a[i];j--)
dp[j]=max(dp[j],dp[j-a[i]]*b[i]);
for(i=sum;i>=0;i--)
{
if(dp[i]>=p)
{

break;
}
}
printf("%d\n",i);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: