ACM 概率&&动态规划

Description

As Harry Potter series is over, Harry has no job. Since he wants to make quick money, (he wants everything quick!) so he decided to rob banks. He wants to make a calculated risk, and grab as much money as possible. But his friends - Hermione and Ron have decided upon a tolerable probabilityP of getting caught. They feel that he is safe enough if the banks he robs together give a probability less than P.

Input

Input starts with an integer T (≤ 100), denoting the number of test cases.

Each case contains a real number P, the probability Harry needs to be below, and an integer N (0 < N ≤ 100), the number of banks he has plans for. Then follow N lines, where line j gives an integer Mj (0 < Mj ≤ 100) and a real number Pj . Bank j contains Mj millions, and the probability of getting caught from robbing it is Pj. A bank goes bankrupt if it is robbed, and you may assume that all probabilities are independent as the police have very low funds.

Output

For each case, print the case number and the maximum number of millions he can expect to get while the probability of getting caught is less than P.

Sample Input

3

0.04 3

1 0.02

2 0.03

3 0.05

0.06 3

2 0.03

2 0.03

3 0.05

0.10 3

1 0.03

2 0.02

3 0.05

Sample Output

Case 1: 2

Case 2: 4

Case 3: 6

解题思路:

题目的大意是,Harry想要抢劫银行,每家银行多有一定的金额和被抓到的概率,知道Roy被抓的最大概率P,求Harry在没有被抓的情况下,抢劫最多的钱数。这是一个背包问题,我们只要做一点转化。把每个银行的储钱量之和当成背包容量,然后概率当成价值来求。这里是被抓的概率,我们把他转化成不被抓的概率,然后这里的和就可以转化成乘积了。然后利用01背包的模版就可以做出来了。

程序代码:

#include <iostream>
#include <cstring>
using namespace std;
int a[105];
double p[105];
double dp[10005];
double max(double x,double y)
{
    return x>y?x:y;
}
int main()
{
    int t,ff=1;
    cin>>t;
    while(t--)
    {
        memset(dp,0,sizeof(dp));
        dp[0]=1;//没有抢劫自然不会被抓
        int n,i,j,s=0;
        double p1;//被抓的概率
        cin>>p1>>n;
        p1=1-p1;//不被抓的概率
        for(i=1;i<=n;i++)
        {
            cin>>a[i]>>p[i];
            s+=a[i];
        }
        for(i=1;i<=n;i++)
        {
            for(j=s;j>=a[i];j--)
                dp[j]=max(dp[j],dp[j-a[i]]*(1-p[i]));
        }
        for(i=s;i>=0;i--)
        {
            if(dp[i]>=p1)
            {
                cout<<"Case "<<ff++<<": "<<i<<endl;
                break;
            }

        }
    }
    return 0;
}
时间: 2024-10-25 05:09:07

ACM 概率&&动态规划的相关文章

ACM:动态规划,物品无限的背包问题(完全背包问题)

题目:有n种物品,每种物品都有无限件可用.第i种物品的体积是vi,重量是wi.选一些物品装到一个容量为C的背包中,使得背包内物品在总体积不超过C的前提下重量尽量大. 分析,完全背包问题,相对于上上篇文章的硬币问题,只是由DAG上的无权图变成了这里的DAG上的带权图! 输出最后满足体积不超过背包容量的条件下,背包中的最大重量. 代码: #include <iostream> #include <string> using namespace std; const int MAXN =

2019-ACM-ICPC-南京区网络赛-D. Robots-DAG图上概率动态规划

2019-ACM-ICPC-南京区网络赛-D. Robots-DAG图上概率动态规划 [Problem Description] ? 有向无环图中,有个机器人从\(1\)号节点出发,每天等概率的走到下一个节点或者停在当前节点,并且第\(i\)天消耗\(i\)的耐久度.求它到达\(n\)号节点时期望消耗的耐久度是多少? ? 题目保证只有一个入度为\(0\)的节点,只有一个出度为\(0\)的节点. [Solution] ? 概率\(dp\). ? 假设每天消耗\(1\)点耐久度.定义\(dp[u]\

Bzoj 3450: Tyvj1952 Easy 期望/概率,动态规划

3450: Tyvj1952 Easy Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 431  Solved: 325[Submit][Status][Discuss] Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化一下这个游戏的规则有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a个comb就有a*a分,comb就是极大的连续o.比如ooxxxxooooxxx

n个骰子各点数和出现的概率--动态规划

题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入n,打印出S的所有可能的值出现的概率. 声明思想非原创!只因动态规划思想的使用很好,记下! 分析:动态规划就是分阶段考虑问题,给出变量,找出相邻阶段间的关系.具体定义给忘了. 1.现在变量有:骰子个数,点数和.当有k个骰子,点数和为n时,出现次数记为f(k,n).那与k-1个骰子阶段之间的关系是怎样的? 2.当我有k-1个骰子时,再增加一个骰子,这个骰子的点数只可能为1.2.3.4.5或6.那k个骰子得到点数和为n的情况有: (k-1

UVA_11468_Substring_(AC自动机+概率动态规划)

描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2463 给出一些子串.然后给出一些字符,以及每个字符出现的概率.现在用这些字符组成一个长度为s的字符串,问之前给出的子串都没有在这个字符串中出现的概率是多少. 分析 边选字母边匹配.只要前面的字串都不能匹配成功即可.用前面的那些子串造出个AC自动机,然后在上面跑.用match数组表示每

【ACM】动态规划?剪枝?贪心?jobdu 1082

题目描述: 使用代理服务器能够在一定程度上隐藏客户端信息,从而保护用户在互联网上的隐私.我们知道n个代理服务器的IP地址,现在要用它们去访问m个服务器.这 m 个服务器的 IP 地址和访问顺序也已经给出.系统在同一时刻只能使用一个代理服务器,并要求不能用代理服务器去访问和它 IP地址相同的服务器(不然客户端信息很有可能就会被泄露).在这样的条件下,找到一种使用代理服务器的方案,使得代理服务器切换的次数尽可能得少. 输入: 每个测试数据包括 n + m + 2 行.    第 1 行只包含一个整数

ACM:动态规划,01背包问题

题目: 有n件物品和一个容量为C的背包.(每种物品均仅仅有一件)第i件物品的体积是v[i],重量是w[i].选一些物品装到这个背包中,使得背包内物品在整体积不超过C的前提下重量尽量大. 解法:两种思路: 第一种:d(i, j)表示"把第i,i+1,i+2,...n个物品装到容量为j的背包中的接下来的最大总重量". d(i, j) = max{d(i+1, j), d(i+1, j-v[i])+w[i]}     前面一项表示不放第i个物品,后面一项表示放第i个物品. 然后取两者之中最大

Bridging signals(NlogN最长上升子序列)

Bridging signals Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2354    Accepted Submission(s): 1536 Problem Description 'Oh no, they've done it again', cries the chief designer at the Waferlan

2018摩拜算法工程师笔试题

一.字符串变形 输入两个字符串a和b,a的长度小于b的长度.现在可以在a中的每个位置插入任意字符,使得最终a的长度等于b的长度,问最后a和b中对应位置字符不同的位置的个数. 这个问题可以看做是:带约束的最长公共子序列 考虑形如abcx 和ayybc的两个字符串,第一个字符串不能添加太多字符,否则会导致它的长度太长.当a[i]=b[j]时,i必须不能大于j,否则a[i]是不可能等于j的. 这道题测试样例过于简单,以至于很多错误解法也能全部通过. import java.util.Scanner;