抢劫案

抢劫案

问题描述
有抱负的罗伊·罗伯(Roy the Robber)看过很多美国电影,并且知道坏蛋通常最终会被抓到,通常是因为他们变得太贪心了。他决定只在短期内从事赚钱的银行抢劫案工作,然后退休,然后再回到大学从事舒适的工作。


几个月来,罗伊(Roy)一直在评估各种银行的安全性和所持有的现金量。他想冒险,并想尽可能多地赚钱。

他的母亲奥拉(Ola)决定了可以忍受的可能性。她认为,如果他一起抢劫的银行给出的概率小于这个概率,他就足够安全了。
 
输入项
输入的第一行给出T,即案例数。对于每种情况,输入的第一行给出一个浮点数P(Roy的概率必须低于此值),以及一个整数N(他有计划的银行数目)。然后跟随N行,其中j行给出一个整数Mj和一个浮点数Pj。
银行j包含Mj百万,而抢劫它的概率为Pj。
 
输出量
对于每个测试用例,输出一条行,他可以预期获得的最大数目为百万,而被捕获的可能性小于设置的限制。

注释和约束
0 <T <= 100
0.0 <= P <= 1.0
0 <N <= 100
0 <Mj <= 100
0.0 <= Pj <= 1.0
如果银行被抢劫,它可能会破产,您可以假定所有概率是独立的,因为警察的资金非常少。

代码:

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

struct bag
{
    int v;
    double p;
}Bag[10010];
double dp[10010];

int main()
{
    int T,N;
    double p;
    cin>>T;
    while(T--)
    {
        cin>>p>>N;
        int sum = 0;
        for(int i = 0; i < N; i++)
        {
           cin>>Bag[i].v>>Bag[i].p;
            sum += Bag[i].v;
        }
        dp[0] = 1;
        for(int i = 0; i < N; i++)
        {
            for(int j = sum; j >= Bag[i].v; j--)
            {
                dp[j] = max(dp[j],dp[j-Bag[i].v]*(1-Bag[i].p));
            }
        }

        for(int i = sum; i >= 0; i--)
        {
            if(dp[i] > 1-p)
            {
                cout<<i<<endl;
                break;
            }
        }
    }
    return 0;
}

 

posted @ 2020-09-24 20:56  图神经网络  阅读(106)  评论(0编辑  收藏  举报
Live2D