HDOJ-2955 Robberies

来源:互联网 发布:bcm20702a0 mac 编辑:程序博客网 时间:2024/05/18 07:16

这道题是01背包问题的变形。01背包问题中dp(i)中的i表示体积,而这道题中i按理说应该表示概率,又因为概率是浮点数不能表示,所以这里的i表示钱。还有我把被抓概率转化为逃跑成功概率便于计算。
状态转移方程:dp(i) = max(dp(i), dp(i - bank[j].money) * bank(j).pos);

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector>using namespace std;#define eps 1e-8struct Bank{    int money;    double pos;}bank[105];double dp[10005];int main(){  //  freopen("in.txt", "r", stdin);    int t;    cin >> t;    while(t--)    {        double s;        int n, sum = 0;        cin >> s >> n;        s = 1 - s;        for(int i = 0; i < n; i++)        {         cin >> bank[i].money >> bank[i].pos;         bank[i].pos = 1 - bank[i].pos;         sum += bank[i].money;        }        memset(dp, 0, sizeof(dp));        dp[0] = 1.0;        for(int i = 0; i < n; i++)            for(int j = sum; j >= 0; j--)        {            double m = dp[j - bank[i].money];            if(m > 0)                dp[j] = max(dp[j], m * bank[i].pos);            if(dp[j] - s < eps)                dp[j] = 0.0;        }        for(int j = sum; j >= 0; j--)        {            if(dp[j] > 0)            {                cout << j << endl;                break;            }        }    }    return 0;}
0 0
原创粉丝点击