博客
关于我
每日一题-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/

    你可能感兴趣的文章
    nullnullHuge Pages
    查看>>
    NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null
    查看>>
    null可以转换成任意非基本类型(int/short/long/float/boolean/byte/double/char以外)
    查看>>
    Number Sequence(kmp算法)
    查看>>
    Numix Core 开源项目教程
    查看>>
    numpy
    查看>>
    Numpy 入门
    查看>>
    NumPy 库详细介绍-ChatGPT4o作答
    查看>>
    NumPy 或 Pandas:将数组类型保持为整数,同时具有 NaN 值
    查看>>
    numpy 或 scipy 有哪些可能的计算可以返回 NaN?
    查看>>
    numpy 数组 dtype 在 Windows 10 64 位机器中默认为 int32
    查看>>
    numpy 数组与矩阵的乘法理解
    查看>>
    NumPy 数组拼接方法-ChatGPT4o作答
    查看>>
    numpy 用法
    查看>>
    Numpy 科学计算库详解
    查看>>
    Numpy.fft.fft和numpy.fft.fftfreq有什么不同
    查看>>
    numpy.linalg.norm(求范数)
    查看>>
    Numpy.ndarray对象不可调用
    查看>>
    Numpy.VisibleDeproationWarning:从不整齐的嵌套序列创建ndarray
    查看>>
    Numpy:按多个条件过滤行?
    查看>>