首页 > 编程语言 >代码随想训练营第四十二天(Python)| 0-1 背包基础、416. 分割等和子集

代码随想训练营第四十二天(Python)| 0-1 背包基础、416. 分割等和子集

时间:2023-11-24 12:33:46浏览次数:44  
标签:背包 weight Python 第四十二 value bag range 随想 dp

[背包基础]
题目:有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
1、二维方式解决背包问题

class Solution:

    def solve_bag(self, weight, value, bag_weight):
        #  dp[i][j] 代表物品为 i,背包重量为 j 的最大价值
        dp = [[0]*(bag_weight+1) for _ in range(len(value))]

        # 初始化数组
        for j in range(weight[0], bag_weight + 1):
            dp[0][j] = value[0]

        # 遍历
        for i in range(1, len(value)):  # 先遍历物品
            for j in range(bag_weight + 1):  # 遍历背包容量
                # 递推公式
                if j < weight[i]:
                    dp[i][j] = dp[i-1][j]
                else:
                    dp[i][j] = max(dp[i-1][j], dp[i-1][j - weight[i]] + value[i])
        return dp[len(value) - 1][bag_weight]

2、一维方式解决背包问题
注意点:倒序遍历,保证物品 i 只被放入一次
dp[j] 代表背包容量为 j 的背包的价值总量为 dp[j]。

class Solution:

    def solve_bag(self, weight, value, bag_weight):
        #  dp[j] 代表背包重量为 j 的最大价值
        dp = [0] * (bag_weight + 1)

        # 初始化数组
        dp[0] = 0

        # 遍历
        for i in range(len(value)):  # 先遍历物品
            for j in range(bag_weight, weight[i] - 1, -1):  # 遍历背包容量
                # 递推公式
                dp[j] = max(dp[j], dp[j - weight[i]] + value[i])

        return dp[bag_weight]

416. 分割等和子集

class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        if sum(nums) % 2 != 0:
            return False
        target = sum(nums) // 2
        dp = [0] * (target+1)
        for num in nums:
            for j in range(target, num-1, -1):
                dp[j] = max(dp[j], dp[j - num] + num)
        return dp[target] == target

标签:背包,weight,Python,第四十二,value,bag,range,随想,dp
From: https://www.cnblogs.com/yixff/p/17852473.html

相关文章

  • Python + BeautifulSoup 采集
    Python是一种非常流行的编程语言,也是开发网络爬虫和数据采集工具的首选语言。在Python中,有许多第三方库可以用于网络爬虫和数据采集,比如requests、beautifulsoup4、selenium等。下面是一个简单的例子,使用requests库采集一个网页:importrequests#发送GET请求response=......
  • 代码随想训练营第四十一天(Python)| 不同的二叉树搜索树
    96.不同的二叉搜索树1、关键点找出状态转移方程classSolution:defnumTrees(self,n:int)->int:#创建dp数组,dp[i]代表节点数为i的二叉搜索树数量dp=[0]*(n+1)#初始化数组dp[0]=1#遍历每个元素作为根节点......
  • python 生成器
    生成器 生成器:当函数中使用了yield关键字那么该函数就是生成器yield关键字跟return功能一样:可以返回值,并且结束当前函数的执行核心区别是下次调用该函数会从yield下一行继续执行代码deffunc():print(1)print(2)yield"卡点1"print(3)print(......
  • Java开发者的Python快速进修指南:面向对象基础
    当我深入学习了面向对象编程之后,我首先感受到的是代码编写的自由度大幅提升。不同于Java中严格的结构和约束,Python在面向对象的实现中展现出更加灵活和自由的特性。它使用了一些独特的关键字,如self和cls,这些不仅增强了代码的可读性,还提供了对类和实例的明确引用。正如Java,Python也......
  • python中怎么识别判断是否是小数?
    defis_float(str):ifstr.count('.')==1:#小数有且仅有一个小数点left=str.split('.')[0]#小数点左边(整数位,可为正或负)right=str.split('.')[1]#小数点右边(小数位,一定为正)lright=''#取整数位的绝对值(排除掉负号)ifstr......
  • 聪明办法学python(task3and4)
    (直接跳到相应部分查看即可)Python基础输入---print()直接使用print()函数,在括号中加入字符串(可以用双引号也可以用单引号,不能混用)print()也可接受多个字符串,用逗号隔开,遇到逗号输出一个空格输出---input()输出使用input()函数![屏幕截图2023-11-13192454](C:\Users\AS......
  • 使用Python在Tkinter中保存异常
    我为其他使用Tkinter接收用户输入的人开发了几个Python程序。为了保持简单和用户友好,命令行或python控制台永远不会打开(即。.pyw文件),因此,当出现异常时,我正在研究如何使用日志库向文件写入错误文本。然而,我很难让它真正捕获异常。例如:我们编写一个会导致错误的函数:defcause_a......
  • Python使用sys.excepthook统一处理异常,并将异常信息记录到日志中
    importsysimporttimeimporttracebackfromdatetimeimportdatetimefromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.support.uiimportWeb......
  • 【接口自动化测试实战】python+requests+Pytest+yaml+Allure
    前言一、先来了解下pytest二、需要具备的基础知识三、开发环境准备四、接口自动化实战(设计项目目录)五、方法封装六、编写自动化用例脚本七、持续集成八、其他自动化框架......
  • 直接讲清楚反转链表和判断子链表是怎么搞的【python】
    Reversed_sub反向子链表题,直接把反向链表和子链表讲清楚。反向假设有一个链表:1->2->3->4->None初始化三个指针:prev:用于指向当前节点的前一个节点。初始时prev为None。current:用于指向当前节点。初始时current指向链表的头节点。next:用于保存当前节点的下一......