DP 动态规划 Problem V 1022 反向考虑的背包

原创 2016年05月31日 22:23:55

Problem V  ID:1022


简单题意:某人准备抢银行,可以承受的最大被抓的概率为p(总共),共有n个银行可抢,分别给出各个银行所拥有的money:mi,抢各个银行被抓的概率pi。求可以抢到的最大金额。


解题思路形成过程:因为概率值的范围为0~1,即有小数,所以必须反向来考虑。

            可以承受的最大被抓的概率为p,即:如果逃跑的概率大于1-p则符合要求。

            将所有银行的总钱数作为背包的容量,dp数组各元素对应的值为逃跑的概率。

            如果抢两个银行i和j,则逃跑概率为(1-pi)*(1-pj),即两个银行逃跑的概率之积。(涉及到概率论)

            状态转移方程为:dp[j]=max(dp[j],dp[j-a[i]]*(1-b[i]));

            dp数组中逃跑率符合要求且下标最大的一个所对应的下标即为所求答案。


感想:一开始被样例给带跑偏了,还以为会出现的概率是精确到小数点后两位的,而实际上并不是。这就决定了很难用常用的背包思想去解决这个问题。

    要学会去反向思考,要求是被抓的概率要符合要求,那逃跑的概率符合要求是否可以?dp数组要存的元素能不能存经常存的下标?


代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
double dp[10001];
int a[101];
double b[101];
int main()
{
    //freopen("1.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(dp,0,sizeof(dp));
        double p;
        int n,sum=0;
        scanf("%lf%d",&p,&n);
        for(int i=0; i<n; ++i)
        {
            scanf("%d%lf",&a[i],&b[i]);
            sum+=a[i];
        }
        dp[0]=1;
        for(int i=0; i<n; ++i)
            for(int j=sum; j>=a[i]; --j)
                dp[j]=max(dp[j],dp[j-a[i]]*(1-b[i]));
        for(int i=sum; i>=0; --i)
        {
            if(dp[i]>1-p)
            {
                printf("%d\n",i);
                break;
            }
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

我的总结-动态规划(DP)

说到动态规划,最开始接触到这类型的题目是在教练上课的时候放了杭电OJ的名为“数塔”的题目,其实仅靠着没有任何算法基础而且对电脑编程处理问题的方式还不熟悉只会暴力加模拟的思维方式,着实没有除开暴力之外的...

J2EE应用性能问题的常用优化项目

性能问题的最明显表现是网页的响应时间变慢。在J2EE系统中,经常体现有下面更为基本的症状:应用服务器资源的使用情况 JVM堆的使用情况 系统资源的使用情况 数据库资源的使用情况 网络活动       ...

dp动态规划分类详解

转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码...

DP 动态规划 Problem W 1023 背包

Problem W  ID:1023 简单题意:共有n万元,有m个学校可申请(0,给出每个学校的申请费用和拿到offer的概率,求至少得到一份offer的最大概率。 ...

dp 动态规划 背包 专项练习题目

  • 2009年05月09日 20:04
  • 14.69MB
  • 下载

dp 背包讲解 动态规划优化

  • 2011年08月30日 20:00
  • 286KB
  • 下载

动态规划算法——背包问题(Dynamic Programming Algorithm - Knapsack Problem)

动态规划算法——背包问题(Dynamic Programming Algorithm - Knapsack Problem)背包问题(Knapsack Problem) (picture is ...

动态规划之01背包问题(Knapsacks Problem)

背包问题 一、01背包问题

DP 动态规划 Problem O 1015 二进制十进制转换

Problem O  ID:1015 简单题意:给出一个1000以内的十进制数,求其二进制形式。 解题思路形成过程:如图所示:             每组的...

OpenJudge - 2989 糖果 动态规划(DP) 重庆一中高2018级竞赛班第十一次测试 2016.9.24 Problem 2

【问题描述】 由于在维护世界和平的事务中做出巨大贡献,Dzx被赠予糖果公司2010年5月23日当天无限量糖果免费优惠券。在这一天,Dzx可以从糖果公司的N件产品中任意选择若干件带回家享用。糖果公司的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DP 动态规划 Problem V 1022 反向考虑的背包
举报原因:
原因补充:

(最多只允许输入30个字)