概率dp (背包+概率) 背包的多一点

题意:XX想抢劫银行,当危险率低于P的时候才能行动,现在给出每家银行的金钱mi和危险率pi,求最多能获得多少金钱;

题解:危险率是P,那么安全率就是1-P,那么XX抢劫的所有银行的安全率之积就不能小于1-P,这样就变成了一个01背包的裸题。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<string.h>
 4 #include<math.h>
 5 using namespace std;
 6 const int maxn=1e2+10;
 7 double dp[maxn*100];
 8 double p[maxn];int v[maxn];
 9 int main()
10 {
11     int T;
12     int cnt=0;
13     scanf("%d",&T);
14     while(T--){
15         double limit;int n;int sum=0;
16         scanf("%lf%d",&limit,&n);
17         limit=1.0-limit;
18         for(int i=1;i<=n;i++){
19             scanf("%d%lf",&v[i],&p[i]);
20             p[i]=1.0-p[i];
21             sum+=v[i];
22         }
23         memset(dp,0,sizeof(dp));
24         dp[0]=1;
25         for(int i=1;i<=n;i++)
26         for(int j=sum;j>=v[i];j--){
27             dp[j]=max(dp[j],dp[j-v[i]]*p[i]);
28         }
29         int i;
30         for(i=sum;i>=0;i--)
31         if(dp[i]>=limit) break;
32         printf("Case %d: %d\n",++cnt,i);
33     }
34     return 0;
35 }

原文地址:https://www.cnblogs.com/pangbi/p/11602528.html

时间: 2024-10-05 13:24:28

概率dp (背包+概率) 背包的多一点的相关文章

CoderForce 148D-Bag of mice (概率DP求概率)

题目大意:美女与野兽在玩画鸽子的游戏.鸽子在用黑布遮住的笼子里,白色的有w只,黑色的有b只,每次拿出一只作画,谁先画到白色的鸽子谁就赢.美女首先画,因为野兽太丑,它每次画的时候都会吓跑一只鸽子,所有出笼子的鸽子都不在进去.求美女赢得概率.(设定假如没有人画到白色鸽子,算野兽赢). 题目分析:这道题不难,很显然的概率DP.这是我第一次写概率DP,纪念一下... 代码如下: # include<iostream> # include<cstdio> # include<vecto

HDU-4089 Activation (概率DP求概率)

题目大意:一款新游戏注册账号时,有n个用户在排队.每处理一个用户的信息时,可能会出现下面四种情况: 1.处理失败,重新处理,处理信息仍然在队头,发生的概率为p1: 2.处理错误,处理信息到队尾重新排队,发生的概率为p2: 3.处理成功,队头信息处理成功,出队,发生的概率为p3: 4.服务器故障,队伍中所有信息丢失,发生的概率为p4: 小明现在在队伍中的第m个位置,问当他前面的信息条数不超过k-1时服务器故障的概率. 题目分析:这道题的状态转移方程不难写.定义状态dp(i,j)表示在有 i 个人的

NOJ 1860 保研(0/1背包概率dp)

保研 时间限制(普通/Java):1000MS/3000MS         运行内存限制:65536KByte 总提交:171          测试通过:40 题目描述 对于一些名校而言,保研不仅可以由学校推免,也可以由学生自己向希望保研的学校提出申请,这个过程有点类似于外国学生向学校提交简历等待Offer的过程.但是,投递申请需要亲自去相应学校的研招办递交材料,这就需要一些成本(比如路费等),且每个院校都有自己的录取成功率.现在,请在总成本不超过限制的情况下,求出最大的成功率. 输入 输入

Codeforces 167B Wizards and Huge Prize 概率dp(水

题目链接:点击打开链接 题意: 给定n个对手,至少要击败其中 l 个人,现在有口袋容量为 k 下面n个数字表示击败这个人的概率 下面n个数字(若为-1表示击败这个人可以获得一个金币,若>0则表示可以增加口袋容量为这个数字) 问: 至少击败其中的l个人,且获得的总口袋容量 >= 获得的金币个数 的概率是多少.(即任何时候金币都不能放不下) 思路: 概率dp 要注意的是有可能口袋容量是负数,但最后的时候变成了正数,所以要给口袋容量都+N, #include <iostream> #in

codeforces 148D 【概率dp】

题目链接: codeforces 148D Bag of mice 题意:一个包里面有w只白老鼠和b只黑老鼠,公主与龙依次从包中拿老鼠,每次取一只,当龙拿时还会从包中溜走一只,先拿到老鼠的获胜,当背包中没老鼠时且之前没人拿到白老鼠则龙获胜,问公主获胜的概率是多少. 题解: 设dp[i][j]为背包中有i只白老鼠j只黑老鼠时公主获胜的概率 则公主获胜的情况分成三种: 1.直接拿到白老鼠 p1=i/(i+j) 2.公主拿到黑老鼠,龙拿到黑老鼠,逃跑一只黑老鼠 p2=(j/(i+j)) ((j-1)/

hdu4815 (概率DP)

由于没有专门练过概率DP , 场上硬推的,由于一点小失误WA了两发 . 我们很容易求出来d[i][j],表示前i道题,得分为j的概率 . 这样,最终打完所有题目之后猴子得任意分数的概率我们就知道了,老虎要想赢就要至少得和他一样的分数,那么就很好办了,从0~max分,不断相加概率,当概率大于P时的分数就是答案 . 细节见代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 5

HDU4089-Activation(概率DP)

Activation Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1332    Accepted Submission(s): 501 Problem Description After 4 years' waiting, the game "Chinese Paladin 5" finally comes out.

HDU 4089 Activation (概率dp 好题 + 难题)

Activation Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1842    Accepted Submission(s): 689 Problem Description After 4 years' waiting, the game "Chinese Paladin 5" finally comes out.

Lightoj 1038 - Race to 1 Again (概率DP)

题目链接: Lightoj  1038 - Race to 1 Again 题目描述: 给出一个数D,每次可以选择数D的一个因子,用数D除上这个因子得到一个新的数D,为数D变为1的操作次数的期望为多少? 解题思路: 概率DP咯,对于只知道期望是:E(X) = X1*p(X1) + X2*p(X2) + …… + Xn*p(Xn)的窝,拿这个题目没有一点办法.然后看了讨论版,发现总会有一些神人存在. 求操作次数的期望时,先设定第i个因子给期望的贡献为Ti,那么有:E = (T1 + T2 + T3

hdu3076ssworld VS DDD 概率dp

//ssworld VS DDD 两个人有血量值 hp1 , hp2 //两人掷骰子得到每一点的概率已知 //ssword赢的概率 //dp[i][j]  表示有第一个人血量为i,第二个人的血量为j第一个人赢的概率 //第一个人赢,第二个人赢 , 平局的概率为p1 , p2 , p3 //那么有dp[i][j] = p2*dp[i-1][j] + p1*dp[i][j-1] + p3*dp[i][j] //整理可得dp[i][j] = p2/(1-p3)*dp[i-1][j] + p1/(1-p