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;
}

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

HDU6092Rikka with Subset(逆向背包)

题意: 有一个数列 a[] ,长度(n 题解: 如果 B_iB​i​​ 是 BB 数组中除了 B_0B​0​​ 以外第一个值不为 00 的位置,那么显然 ii 就是 AA 中的最小数。...
  • Rain722
  • Rain722
  • 2017年08月09日 11:01
  • 153

0-1背包问题——动态规划法

问题描述:给定n种物品和一背包。物品i的重量是w[i],其价值为v[i],背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 分析:对于一种物品,要么装入背包,要么不装。所以...
  • laoniu_c
  • laoniu_c
  • 2014年08月09日 08:23
  • 1636

01背包 ,完全背包,多重背包 dp (动态规划入门dp)

dp 动态规划,确实难啃, 光 最简单的 背包问题,就 费老大劲. 思想! 思想! 思想!   类似于递推, 局部找 关系.  背包问题,  就两种状态  放还是不放?   其实关于背包放不放的问题,...
  • sizaif
  • sizaif
  • 2017年04月12日 22:44
  • 1132

夕拾算法进阶篇:20)货币系统 (完全背包_动态规划DP)

题目描述 母牛们不但创建了他们自己的政府而且选择了建立了自己的货币系统。,他们对货币的数值感到好奇。传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单位面值组成的。 母牛想知...
  • jiangpeng59
  • jiangpeng59
  • 2017年02月12日 10:16
  • 235

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

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

DP——01背包问题使用迭代和动态规划(超详细——小白入门)

假设我是一个小偷,到达某个地方抢劫,并且没有人在家。 我为了放置物品而拿的麻袋最多可以承重5公斤。我要偷东西最大利润是多少?(PS纯属虚构)...
  • jushang0235
  • jushang0235
  • 2017年12月19日 13:57
  • 113

DP为王——动态规划法学习笔记

动态规划英文名Dynamic Programming,这个名称总让人有一种时曾相识的感觉,可能是因为容易和“线性规划”之类的概念搞混。         首先,适用动态规划的问题十分广...
  • dreamzuora
  • dreamzuora
  • 2016年08月01日 10:25
  • 640

(动态规划DP算法)To the Max

Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is...
  • u013602059
  • u013602059
  • 2015年03月19日 11:39
  • 329

hdu-1022 Train Problem I

http://acm.hdu.edu.cn/showproblem.php?pid=1022 题意说在一个火车站只用一个铁轨可供停车,并且每次进入铁轨的车必须等后进来的车走之后才能开走,火车数量最多...
  • u012773338
  • u012773338
  • 2014年10月15日 19:50
  • 523

动态规划之:让你轻松理解背包算法

动态规划之:背包算法最简单的理解 1.常用的算法设计技术:贪心算法,分治和动态规划。 贪心:寻找局部最优,代替全局最优。比如说不带权的区间调...
  • A784586
  • A784586
  • 2017年03月19日 00:01
  • 1100
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DP 动态规划 Problem V 1022 反向考虑的背包
举报原因:
原因补充:

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