当前位置: 首页 > article >正文

代码随想录算法训练营第34天| 动态规划:01背包理论基础(二维和一维)、416. 分割等和子集

模板:

  • 今日学习的文章链接和视频链接
  • 自己看到题目的第一想法
  • 看完代码随想录之后的想法 
  • 自己实现过程中遇到哪些困难 
  • 今日收获,记录一下自己的学习时长

动态规划:01背包理论基础

题目链接:46. 携带研究材料(第六期模拟笔试)

学习链接:代码随想录

题解:

法一:

def fun():
    s = input().split()
    m = int(s[0])
    n = int(s[1])
    weight = list(map(int,input().split()))
    value= list(map(int,input().split()))



    dp = [[0]*(n+1) for _ in range(m)]

    for i in range(m):
        dp[i][0] = 0
        
    for j in range(1,n+1):
        if j >= weight[0]:
            dp[0][j]= value[0]
        else:
            dp[0][j]= 0
            
    for i in range(1,m):
        for j in range(1,n+1):
            if j < weight[i]:
                dp[i][j] = dp[i-1][j]
            else:
                dp[i][j] = max(dp[i-1][j],value[i]+dp[i-1][j-weight[i]])
    
    return dp[m-1][n]

print(fun())

梳理一下还是挺有意思的


动态规划:01背包理论基础(滚动数组)

题目链接:46. 携带研究材料(第六期模拟笔试)

学习链接:代码随想录

题解:

法一:

def fun():
    s = input().split()
    m = int(s[0])
    n = int(s[1])
    weight = list(map(int,input().split()))
    value= list(map(int,input().split()))

    dp = [0]*(n+1)

    for j in range(n+1):
        dp[j] = 0
                
    for i in range(m):
        for j in range(n,0,-1):
            if j < weight[i]:
                dp[j] = dp[j]
            else:
                dp[j] = max(dp[j],value[i]+dp[j-weight[i]])
    return dp[n]

print(fun())

正序和倒序的区别


416. 分割等和子集

题目链接:​​​​​​​416. 分割等和子集 - 力扣(LeetCode)

学习链接:​​​​​​​代码随想录

题解:

法一:

class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        # 用二维写 空间复杂度很高
        s = sum(nums)
        if s % 2 != 0:
            return False
        else:
            n = s//2
        m = len(nums)
        dp = [[0]*(n+1) for _ in range(m)]
        for i in range(m):
            dp[i][0] = 0
        for j in range(1,n+1):
            if nums[0] <= j:
                dp[0][j] = nums[0]
            else:
                dp[0][j] = 0
        for i in range(1,m):
            for j in range(1,n+1):
                if j < nums[i]:
                    dp[i][j] = dp[i-1][j]
                else:
                    dp[i][j] = max(dp[i-1][j],dp[i-1][j-nums[i]]+nums[i])
        return dp[m-1][n] == n

注意边界 nums的边界有点问题 可以思考一下

以及一维的解法。


http://www.kler.cn/a/525314.html

相关文章:

  • GSI快速收录服务:让你的网站内容“上架”谷歌
  • [论文总结] 深度学习在农业领域应用论文笔记14
  • 【张雪峰高考志愿填报】合集
  • 深入理解Pytest中的Setup和Teardown
  • 【C++】特殊类设计
  • Cannot resolve symbol ‘XXX‘ Maven 依赖问题的解决过程
  • 【实践案例】使用Dify构建企业知识库
  • 探索Linux中的进程控制:从启动到退出的背后原理
  • 使用 Iptables 实现网络安全策略:从入门到精通
  • Python 梯度下降法(一):Gradient Descent
  • 10.8 FileSystemWatcher(文件监视)组件
  • k均值聚类将数据分成多个簇
  • 高级编码参数
  • 【Attention】KV Cache
  • TypeScript 学习 -类型 - 10
  • 快速提升网站收录:内容创作的艺术
  • 工具的应用——安装copilot
  • 高速PCB设计指南3——PCB 传输线和受控阻抗
  • 供应链系统设计-供应链中台系统设计(十)- 清结算中心概念片篇
  • Python3 【内置函数】:使用示例参考手册
  • JVM--类加载器
  • 超越传统图结构:记忆模拟新突破
  • C语言从入门到进阶
  • 【deepseek】本地部署DeepSeek R1模型:使用Ollama打造个人AI助手
  • 并发编程 - 线程同步(二)
  • 【2024年华为OD机试】 (A卷,200分)- 服务中心选址(JavaScriptJava PythonC/C++)