【HDU 2955】【背包问题】Robberies

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

其实就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;
}


你可能感兴趣的:(c,背包)