博客
关于我
01背包(小偷的概率)
阅读量:585 次
发布时间:2019-03-12

本文共 1653 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要找到一种方法来计算Roy抢取银行时的最大收益,同时确保逃脱的概率不超过给定的阈值。这个问题类似于0-1背包问题,但带有概率约束。因此,我们需要使用动态规划来解决这个问题。

方法思路

  • 问题分析:Roy可以选择抢取每个银行的钱,但每个银行抢取会带来一个成功概率Pj,我们需要确保所有抢取动作的成功概率不超过给定的阈值P。
  • 动态规划的状态转移:我们使用一个数组dp,其中dp[i]表示抢取i元的成功概率。初始化时,dp[0] = 1.0,因为没有抢取任何银行时的成功概率是1。
  • 更新规则:对于每个银行,考虑是否抢取该银行,更新dp数组。抢取银行j会增加Mj元,且成功概率变为当前概率乘以(1 - Pj)。
  • 寻找最大值:处理完所有银行后,从dp数组中找到最大的i,使得dp[i] <= P。
  • 解决代码

    def main():    import sys    input = sys.stdin.read    data = input().split()    idx = 0    T = int(data[idx])    idx += 1    for _ in range(T):        P = float(data[idx])        N = int(data[idx+1])        idx +=2        v = []        w = []        sumM = 0        for _ in range(N):            M = int(data[idx])            P_b = float(data[idx+1])            v.append(M)            w.append(P_b)            sumM += M            idx +=2                MAX = sumM        dp = [0.0]*(MAX +1)        dp[0] = 1.0        for j in range(MAX +1):            if dp[j] ==0:                continue            for i in range(j, -1, -1):                if i ==j:                    idx_j = j + v[i]                    if idx_j > MAX:                        continue                    prob = dp[i] * (1 - w[i])                    if prob > dp[idx_j]:                        dp[idx_j] = prob                for i in range(MAX, -1, -1):            if dp[i] <= P and dp[i] >=0:                print(i)                break    if __name__ == "__main__":    main()

    代码解释

    • 输入处理:读取输入数据并解析。每个测试用例包含一个阈值P和N个银行的信息。
    • 动态规划数组初始化:初始化dp数组,其中dp[0] = 1.0表示没有抢取任何银行时的成功概率。其他位置初始化为0。
    • 状态转移:对于每个银行,更新dp数组。从当前最大金额向下遍历,计算抢取该银行后的概率更新。
    • 查找最大值:从最大金额开始向下查找,找到第一个满足dp[i] <= P的值,这就是 Roy可以得到的最大金额。

    这种方法确保了我们能计算出在不超过给定概率约束下,Roy能获取的最大金额。

    转载地址:http://ekrtz.baihongyu.com/

    你可能感兴趣的文章
    ciscn_2019_n_3 题解
    查看>>
    pwn题shellcode收集
    查看>>
    OWASP Top 10 2017 学习笔记
    查看>>
    Linux安装软件时出现软件包不满足依赖关系libxx
    查看>>
    vim ,vi总是卡死
    查看>>
    使用docker搭建nfs实现容器间共享文件 nfs server nfs client
    查看>>
    Failed to establish a new connection: [Errno -2] 未知的名称或服务‘
    查看>>
    CURL 发送请求详解
    查看>>
    python中的序列化
    查看>>
    django中使用celery执行异步任务实现
    查看>>
    区块链初步了解
    查看>>
    centos7安装telnet服务
    查看>>
    redis简单使用示例(附代码)
    查看>>
    centos7 安装 mongodb3.6.3
    查看>>
    什么是Linux内核?它有什么功能?
    查看>>
    机器学习前沿:Michael Jordan与鬲融、金驰、马腾宇等青年才俊的对话
    查看>>
    LIVE 预告 | 牛津胡庆拥:学习理解大规模点云
    查看>>
    java有道翻译
    查看>>
    无线通信模块种类和优点
    查看>>
    lora技术在无线抄表行业应用
    查看>>