LightOJ - 1079 概率dp

题意:n个银行,每个有价值和被抓概率,要求找被抓概率不超过p的最大价值

题解:dp[i][j]表示前i个取j价值的所需最小概率,01背包处理,转移方程dp[i][j]=min(dp[i-1][j],dp[i-1][j-v[i]]+(1-dp[i-1][j-v[i]])*p)

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pii pair<int,int>

using namespace std;

const double g=10.0,eps=1e-12;
const int N=100+10,maxn=10000+10,inf=0x3f3f3f3f;

double dp[N][maxn],gl[N];
int value[N];
int main()
{
    int res=0,t;
    scanf("%d",&t);
    while(t--)
    {
        double p;
        int n;
        scanf("%lf%d",&p,&n);
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%lf",&value[i],&gl[i]);
            sum+=value[i];
        }
        for(int i=0;i<=n;i++)
            for(int j=0;j<=sum;j++)
                dp[i][j]=1;
        dp[0][0]=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<=sum;j++)
            {
                if(j>=value[i])dp[i][j]=min(dp[i-1][j],dp[i-1][j-value[i]]+(1-dp[i-1][j-value[i]])*gl[i]);
                else dp[i][j]=dp[i-1][j];
            }
        }
        for(int i=sum;i>=0;i--)
        {
            if(dp[n][i]<p)
            {
                printf("Case %d: %d\n",++res,i);
                break;
            }
        }
    }
    return 0;
}
/********************
dp[i]抢到i元被抓概率不超过p
********************/

时间: 2024-10-09 19:04:12

LightOJ - 1079 概率dp的相关文章

LightOJ - 1151概率dp+高斯消元

概率dp+高斯消元 https://vjudge.net/problem/LightOJ-1151 题意:刚开始在1,要走到100,每次走的距离1-6,超过100重来,有一些点可能有传送点,可以传送到前面或后面,那么概率dp没法递推,只能高斯消元 设期望E(x),首先100这个位置的期望E(100)=0,然后可以找出方程, 对于传送点,E(x)=E(go(x)),对于非传送点,E(x)=(E(x+1)+E(x+2)+E(x+3)+E(x+4)+E(x+5)+E(x+6)+6)/cnt(cnt是可

Lightoj 1030 概率dp

Problem: Analyse: dp[i]为i开始走到结尾的价值, 那么dp[i]是从后面的6个转移过来的. 这样我们就倒着递推就好了(后面的要先算好). 注意后面不足六个的时候的处理情况. /**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 一 5/ 9 20:38:59 2016 *File Name* : .cpp **Code**:

lightoj 1408 概率dp

https://blog.csdn.net/moon_sky1999/article/details/98097470 博主在此,牛逼神犇 1 #include<bits/stdc++.h> 2 using namespace std; 3 const double eps = 1e-9; 4 int main(){ 5 int T,k1,k2; 6 double p; 7 scanf("%d",&T); 8 for(int cas=1;cas<=T;cas+

LightOJ 1364 树形DP

52张扑克牌,问拿到指定数量的4个花色的最少次数期望是多少,其中拿到joker必须马上将其视作一种花色,且要使后续期望最小. 转移很容易想到,主要是两张joker的处理,一个状态除了普通的4个方向的转移,当没拿到joker时还要增加拿到joker的期望,根据题意直接在当前状态下找最小的期望计算即可. /** @Date : 2017-08-29 17:58:59 * @FileName: LightOJ 1364 概率DP.cpp * @Platform: Windows * @Author :

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

LightOJ 1065 Island of Survival (概率DP?)

题意:有 t 只老虎,d只鹿,还有一个人,每天都要有两个生物碰面,1.老虎和老虎碰面,两只老虎就会同归于尽 2.老虎和人碰面或者和鹿碰面,老虎都会吃掉对方 3.人和鹿碰面,人可以选择杀或者不杀该鹿4.鹿和鹿碰面,没事问人存活下来的概率 析:最后存活肯定是老虎没了,首先可以用概率dp来解决,dp[i][j] 表示 还剩下 i 考虑, j 只鹿存活的概率是多少. 然后每次分析这几种情况即可. 还有一种思路就是只要考虑老虎没了,只要老虎没了就能存活,只要计算老虎全死完的概率就好,首先如果老虎是奇数,是

LightOJ 1268 Island of Survival 数学神解/不用写那些guapi概率dp

谢谢Wen_kr的翻译 题目大意: 你困在一个岛上,上面有老虎和鹿,分别有 只与 只. 如果有一天,你和老虎相遇,那么你死,你和鹿相遇,那么你可以选择杀死或者不杀死这头鹿,老虎和鹿相遇,那么鹿死,鹿和鹿相遇,什么也不会发生,老虎与老虎相遇,那么它们会杀死对方. 每天仅能有一对动物相遇,问你不死并且所有老虎死掉的最大概率. 第一种解法:概率dp 设dp[i][j]为i头老虎j头鹿满足条件的概率...... 这个解法不重要,重要的是下一个. 第二种解法:数学贪心 尽量让老虎自相残杀 即当前老虎为t,

Throwing Dice(概率dp)

C - Throwing Dice Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu LightOJ 1064 uDebug Description n common cubic dice are thrown. What is the probability that the sum of all thrown dice is at least x? Input Input starts wit

Codeforces 28C [概率DP]

/* 大连热身D题 题意: 有n个人,m个浴室每个浴室有ai个喷头,每个人等概率得选择一个浴室. 每个浴室的人都在喷头前边排队,而且每个浴室内保证大家都尽可能均匀得在喷头后边排队. 求所有浴室中最长队伍的期望. 思路: 概率dp dp[i][j][k]代表前i个浴室有j个人最长队伍是k的概率. 枚举第i个浴室的人数.然后转移的时候其实是一个二项分布. */ #include<bits/stdc++.h> using namespace std; int jilu[55]; double dp[