博客
关于我
每日一题-dfs遍历
阅读量:326 次
发布时间:2019-03-04

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

为了解决这个问题,我们需要计算小L在选择物品时,使得选出来的总喜欢值大于给定的值M的方案数。每类物品最多只能选择一个物品,可以不选。

方法思路

我们可以使用动态规划的方法来解决这个问题。具体步骤如下:

  • 初始化:使用一个字典dp_current来记录当前层级的总和及其对应的方案数,初始时dp_current为{0:1},表示在处理0层级时,总和为0的方案数为1。
  • 逐层处理:对于每一层级,创建一个新的字典dp_next,记录下一层级的总和及其方案数。
  • 遍历物品:对于每个当前层级的总和,遍历该层级的所有物品,计算新的总和。如果新的总和超过M,则直接计入结果;否则,将其加入dp_next。
  • 更新状态:将dp_current更新为dp_next,继续处理下一层级。
  • 输出结果:处理完所有层级后,输出结果。
  • 这种方法通过逐层处理每个层级,并记录当前的总和,避免了重复计算,并且在处理v超过M的情况时,可以立即计入结果,从而减少计算量。

    解决代码

    def main():    import sys    input = sys.stdin.read().split()    ptr = 0    while ptr < len(input):        k = int(input[ptr])        M = int(input[ptr+1])        ptr +=2        layers = []        for _ in range(k):            ai = int(input[ptr])            vs = list(map(int, input[ptr+1:ptr+1+ai]))            layers.append(vs)            ptr += 1 + ai        result = 0        dp_current = {0:1}        for vs in layers:            dp_next = {}            for v, count in dp_current.items():                for vj in vs:                    new_v = v + vj                    if new_v > M:                        result += count                    else:                        if new_v in dp_next:                            dp_next[new_v] += count                        else:                            dp_next[new_v] = count            dp_current = dp_next        print(result)if __name__ == "__main__":    main()

    代码解释

  • 读取输入:使用sys.stdin.read()读取所有输入,并进行解析。
  • 初始化变量:读取k和M的值,初始化dp_current字典。
  • 处理每一层级:对于每一层级的物品,遍历当前层级的所有总和,计算新的总和,并更新dp_next字典。
  • 更新状态:将dp_current更新为dp_next,继续处理下一层级。
  • 输出结果:处理完所有层级后,输出结果。
  • 这种方法有效地计算了满足条件的方案数,避免了重复计算,并且在处理较大值时表现良好。

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

    你可能感兴趣的文章
    Python函数只返回第一个值而不是数据框
    查看>>
    Python+SQL实战:京东用户行为数据分析案例解析(上)
    查看>>
    Python+SQL实战:京东用户行为数据分析案例解析(下)
    查看>>
    PYTHON+Twisted+sqlanydb=ABORT()
    查看>>
    Python函数之返回值、作用域和局部变量
    查看>>
    Python+统计学 | 探索常用的数据分析统计分布
    查看>>
    python, selenium中用于切换帧的函数
    查看>>
    python函数
    查看>>
    python----线程、进程、协程的区别及多线程详解
    查看>>
    python---5
    查看>>
    python---使用celery分布式系统异步发送短信(云通讯)来验证登录
    查看>>
    python--003--百分号字符串拼接、format
    查看>>
    Python--10、线程
    查看>>
    Python--Redis实战:第四章:数据安全与性能保障:第4节:复制
    查看>>
    python--基本代码规范
    查看>>
    Python--抽象类接口类
    查看>>
    PYTHON--欧拉习题二
    查看>>
    python--高级应用总结
    查看>>
    python-520表白代码,我看谁说程序员不懂浪漫,送你几套表白代码,一步到位
    查看>>
    Python-Asyncio TypeError:无法在‘;等待‘;表达式中使用对象DICT
    查看>>