hdu2955(多重背包变形)

来源:互联网 发布:女鬼桂缘捏脸数据 编辑:程序博客网 时间:2024/04/29 07:08

题目链接Robberies

每个银行j可以被抢的钱为Mj,被抓的概率为Pj,求在低于概率P时可以抢到最大的钱数


即求在拿到的钱为v时,能达到最大的不被抓的概率

状态转移方程



#include <stdio.h>  #include <algorithm>  #include <iostream>  #include <cmath>  #include <string.h>  using namespace std;    const int N = 50005;    int main()  {    //  freopen("in.txt", "r", stdin);      int t, m0, m[N];      double p0, p[N], ans[N];      scanf("%d", &t);      while(t --)      {          scanf("%lf%d", &p0, &m0);          int sum = 0;          for(int i = 0; i < m0; i ++)          {              scanf("%d%lf", &m[i], &p[i]);              sum += m[i];          }          memset(ans, 0, sizeof(ans));          ans[0] = 1;          for(int i = 0; i < m0; i ++)          {              for(int j = sum; j >= m[i]; j --)              {                  ans[j] = max(ans[j], ans[j - m[i]] *(1 - p[i]));              }          }          for(int i = sum; i >= 0; i --)          {              if(ans[i] > (1 - p0))              {                  printf("%d\n", i);                  break;              }          }      }      return 0;  }


0 0