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

    你可能感兴趣的文章
    npm error Missing script: “server“npm errornpm error Did you mean this?npm error npm run serve
    查看>>
    npm error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装
    查看>>
    npm install CERT_HAS_EXPIRED解决方法
    查看>>
    npm install digital envelope routines::unsupported解决方法
    查看>>
    npm install 卡着不动的解决方法
    查看>>
    npm install 报错 EEXIST File exists 的解决方法
    查看>>
    npm install 报错 ERR_SOCKET_TIMEOUT 的解决方法
    查看>>
    npm install 报错 Failed to connect to github.com port 443 的解决方法
    查看>>
    npm install 报错 fatal: unable to connect to github.com 的解决方法
    查看>>
    npm install 报错 no such file or directory 的解决方法
    查看>>
    npm install 权限问题
    查看>>
    npm install报错,证书验证失败unable to get local issuer certificate
    查看>>
    npm install无法生成node_modules的解决方法
    查看>>
    npm install的--save和--save-dev使用说明
    查看>>
    npm node pm2相关问题
    查看>>
    npm run build 失败Compiler server unexpectedly exited with code: null and signal: SIGBUS
    查看>>
    npm run build报Cannot find module错误的解决方法
    查看>>
    npm run build部署到云服务器中的Nginx(图文配置)
    查看>>
    npm run dev 和npm dev、npm run start和npm start、npm run serve和npm serve等的区别
    查看>>
    npm run dev 报错PS ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
    查看>>