【HDU 2955】【背包问题】Robberies

来源:互联网 发布:动画生成软件 编辑:程序博客网 时间:2024/05/16 15:24

题目大意就是一个人想要抢银行,然后给了每个银行有的钱和被抓的概率,然后他的麻麻很担心他被抓,也给出了一个不被抓概率,求不低这个概率,能抢到多少

其实就01背包,不清楚01背包可以看我博客里面的文,虽然写的很渣。

#include "stdio.h"#include "string.h"float max(float a, float b)//平时的max函数都是返回int这次返回float。忘记改了,三个点造成a不了{  return a>b?a:b;}int main(int argc, char const *argv[]){  int t,num;  int v[105];  double p[105],dp[100005];  double under;  scanf("%d",&t);  while(t--)  {    int sum=0;    memset(dp,0,sizeof(dp));    dp[0]=1;//当什么东西都没去偷,你自然不可能被抓住了    scanf("%lf %d",&under,&num);    for (int i = 0; i < num; ++i)    {      scanf("%d %lf",&v[i],&p[i]);//这里给的是被抓的概率!!!不要记错了!!!      sum+=v[i];    }    for (int i = 0; i < num; ++i)      for (int j = sum; j >= v[i]; j--)      {        dp[j]=max(dp[j],dp[j-v[i]]*(1-p[i]));//概率之间是乘法!!!不是加法!!果然最近智力下降的厉害       // printf("%lf\n",dp[j]);      }    for (int i = sum; i >= 0; i--)    {      //printf("%lf\n",dp[i]);      if(dp[i]>=(1-under))      {        printf("%d\n",i);        break;      }    }  }  return 0;}


0 0