day43|动态规划6-完全背包及其应用-零钱兑换II-组合总和IV

news2024/11/24 8:48:02

完全背包

前情提要: 0-1背包指的是给定背包重量,将物品放入背包中,使得背包中的物品达到最大的价值。(每个物品只能往其中放一次)
在0-1背包问题中,第二层for循环需要是倒序遍历才可以保证每个物品只使用一次,如果物品使用的次数没有限制,只需要将第二个for循环改成正序遍历即可。
在这里插入图片描述
完全背包:

  1. 第二层for循环需要变成正序
  2. 完全背包:背包和物品的顺序没有要求,先遍历背包或者先遍历物品都可以,都可以得到背包中的最大价值。
# 代码来自于代码随想录
# 先遍历物品,再遍历背包
def test_complete_pack1():
    weight = [1, 3, 4]
    value = [15, 20, 30]
    bag_weight = 4
    dp = [0]*(bag_weight + 1)
    for i in range(len(weight)):
        for j in range(weight[i], bag_weight + 1):
            dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
    print(dp[bag_weight])

# 先遍历背包,再遍历物品
def test_complete_pack2():
    weight = [1, 3, 4]
    value = [15, 20, 30]
    bag_weight = 4

    dp = [0]*(bag_weight + 1)

    for j in range(bag_weight + 1):
        for i in range(len(weight)):
            if j >= weight[i]: dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
    
    print(dp[bag_weight])


if __name__ == '__main__':
    test_complete_pack1()
    test_complete_pack2()

518. 零钱兑换 II

完全背包问题: 装满这么大的背包有多少中可能,零钱可以想象成物品,物品有无限次的存取机会。

  1. dp[j]:背包容量为j,有多少种可能性
  2. 递推公式(类似于装满一个背包有多少种方法):dp[j] += dp[j-nums[i]],后放入一个物品取决于之前的物品情况,因而需要将该式子抽象成求和的问题。
  3. dp数组的初始化:
  4. 遍历顺序
  5. 打印dp数组

注意:

  1. 先遍历背包再遍历物品是排列数
  2. 先遍历物品再遍历背包是组合数
class Solution:
    def change(self, amount: int, coins: List[int]) -> int:
        # 可以抽象成背包问题,每个物品可以使用无限次,因此这是一个完全背包的问题。
        # 也可以使用回溯法进行求解
        nums = coins
        target = amount
        dp = [0] * (target + 1)
        dp[0] = 1
        
        # 先物品,后背包(排列)
        for i in range(len(nums)):
            for j in range(nums[i],target+1):
                dp[j] += dp[j-nums[i]]
        return dp[target]

377. 组合总和 Ⅳ

class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        if min(nums) > target:
            return 0
        dp = [0] * (target + 1)
        dp[0] = 1
        '''
        # 先物品,后背包(排列)
        for i in range(len(nums)):
            for j in range(nums[i],target+1):
                dp[j] += dp[j-nums[i]]
                print(nums[i],j,dp)
        return dp[target]
        '''
        # 先物品,后背包(组合)
        for j in range(target+1):
            for i in range(len(nums)):
                if j-nums[i]>=0:
                    dp[j] += dp[j-nums[i]]
        return dp[target]

拓展:为什么顺序不同解决的排列和组合的问题也不同(以组合综合问题为例分析)

分析: 边将通过dp数组的输出结果来分析为什么背包和物品的遍历顺序不同,对应的排列和组合的问题也不同。

先背包后物品: 组合问题(组合总和)[1,2]&[2,1]算作两种情况

for j in range(target+1):
    for i in range(len(nums)):
        if j-nums[i]>=0:
            dp[j] += dp[j-nums[i]]
            print(j,nums[i],dp)
return dp[target]

在这里插入图片描述
在这里插入图片描述
如果先遍历背包重量的话,那么过程中每次都会重新遍历一次物品,例如遍历背包重量为3,此时的前面的状态
背包重量为2:(1,1)(2)
背包重量为1:(1)
背包重量为0:(0)
先遍历重量为1的物品,得到如下结果(1,1,1)(2,1)
遍历重量为2的物品,得到如下结果(1,2)
遍历重量为3的物品,得到如下结果(3)
此时一共有4中情况,将前面的情况全都囊括再其中了,如果按照此种方式求解的话,得到的结果是组合的情况。

先物品后背包: 排列问题(零钱兑换)[1,2]&[2,1]算作一种情况

        for i in range(len(nums)):
            for j in range(nums[i],target+1):
                dp[j] += dp[j-nums[i]]
                print(j,nums[i],dp)
        return dp[target]

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/596851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pandas使用技巧

Pandas 是一个强大的数据分析 Python 库,提供了一系列用于数据清洗、转换、分析和可视化的 API。在使用 Pandas 进行数据处理时,常见的指令包括: 数据读取和解析 read_csv():用于读取 CSV、Excel等格式的数据文件,并将…

大数据:HDFS存储原理,fsck命令查看文件副本状态,namenode元数据,edits流水账,fsimage合并,hdfs读取数据

大数据:HDFS存储原理,fsck命令查看文件副本状态,namenode元数据,edits流水账,fsimage合并,hdfs读取数据 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人&#xff0…

django业务流程配置

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

【MySQL】如何速通MySQL(2)

📌前言:本篇博客介绍如何速通MySQL的第二篇,主要介绍Mysql中主要的基础的入门,学习MySQL之前要先安装好MySQL,如果还没有安装的小伙伴可以看看博主前面的博客,里面有详细的安装教程。或者看一下下面这个链接…

结构方程模型(SEM)以及用R语言实现

目录 结构方程模型概述 结构方程模型匹配 1.协方差SEM 2.分段SEM 在R语言中实现sem进行结构方程建模和路径图可视化 – 拓端tecdat 结构方程模型是一个线性模型框架,它对潜变量同时进行回归方程建模。 ​​​​​​​在R语言中实现SEM进行结构方程建模和路径图…

VPP 编译记录

目录 虚拟机安装 VPP编译 下载一些工具 下载vpp源码 编译 首次构建 非首次直接编译 虚拟机安装 由于使用的统信系统作为宿主机器,在上面貌似只有VM virtualBox软件,先在应用商店安装此应用。 下载ubuntu 64位镜像 一开始没注意下载了32位的系统…

基于springboot_vue的学生在线选课java教学质量评价系统

对教师教学质量进行客观公正的评价,是一项十分严肃和重要的工作。是引导教师进行教学方法改进,提高教学质量的重要手段。它以教师的教学活动为主要评价对象,通过教学评价,发现存在的问题,了解学生的实际学习状况,明确教学改进的努力方向。但是…

【算法系列之二叉树II】leetcode112. 路径总和

257. 二叉树的所有路径 力扣题目链接 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 输入:root [1,2,3,null,5] 输出:["1->2->5","…

解决spark程序 Permission denied: user=<username>, access=WRITE...等常见hive权限报错

Permission Denied Permission Denied: 这是最常见的错误消息之一&#xff0c;表示当前用户没有足够的权限执行写入操作。报错信息可能类似于&#xff1a; org.apache.hadoop.security.AccessControlException: Permission denied: user<username>, accessWRITE, inode&…

Linux教程——操作系统是什么,操作系统概述

Linux 也是众多操作系统之一&#xff0c;要想知道 Linux 是什么&#xff0c;首先得说一说什么是操作系统。 计算机是一台机器&#xff0c;它按照用户的要求接收信息、存储数据、处理数据&#xff0c;然后再将处理结果输出&#xff08;文字、图片、音频、视频等&#xff09;。计…

Linux高级---k8s安全认证

文章目录 一、访问控制概述1、客户端2、认证、授权与准入控制 二、认证管理1、认证方式2、HTTPS认证大体分为3个过程 三、授权管理1、授权策略2、RBAC3、Role、ClusterRole4、RoleBinding、ClusterRoleBinding5、RoleBinding引用ClusterRole进行授权6、实战&#xff1a;创建一个…

Java线程池总结

背景 Java线程池的写法和参数是面试中出现频率很高的基础题。越是基础的东西&#xff0c;特别是对高阶职位的面试者&#xff0c;需要回答的符合自己面试的职位等级。 这里也不能说是一个多么好的答案&#xff0c;只是说如果是我&#xff0c;我怎么回答&#xff0c;仅供参考。…

Java --- springboot3依赖管理和自动配置机制

目录 一、依赖管理机制 二、自动配置机制 一、依赖管理机制 &#x1f695;、为什么导入starter-web所有相关依赖都导入进来&#xff1f; ①、开发什么场景&#xff0c;导入什么场景启动器。 ②、maven依赖传递原则。A-B-C&#xff1a; A就拥有B和C ③、导入 场景启动器。 场…

JavaScript 发展的前世今生

专栏介绍 本专栏主要用作于开放性知识点分享学习&#xff0c;其主要知识点范围是 以围绕 原生 JavaScript 语法 从基础知识到高阶语法阶段的学习分享。 导语&#xff1a; 既然博主&#xff0c;计划将此专栏打造为 JavaScript 的知识点学习分享集结地。所以&#xff0c;本章节就…

奥威BI,适合中国电商的大数据分析平台

电商数据分析做得好不好&#xff0c;除了分析思维这类主要因素外&#xff0c;大数据分析平台的选择也尤为重要。从电商数据分析实际体验来看&#xff0c;电商行业需要大数据分析平台需满足海量数据秒分析、数据直观易懂、操作简单易上手这三大基础要求&#xff0c;如能提供系统…

Tomcat下载安装以及配置

目录 tomcat的下载安装 修改控制台乱码 idea配置tomcat tomcat的下载安装 到tomcat的官网https://tomcat.apache.org/下载所需版本&#xff0c;我们下载的tomcat必须要和我们的jdk相匹配否则会导致tomcat运行和部署的时候出错&#xff0c;挑选tomcat的版本的时候参考下图 …

阿里系cookie之acw_sc__v2 逆向分析

文章目录 声明案例地址目标参数加密流程与逆向分析js代码python调用测试声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除! cookie中使用acw_sc__v2的网站有很多,比如前程无忧、诸葛找房、…

2023年6月跟资深软考辅导专家学习备考软考(中/高级)到这家

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成…

收集关键词的方法有哪些?(如何查找精准的行业流量关键词)

关键词的收集通常可以通过以下几种方法: 关键词收集方法 1.根据市场价值、搜索词竞争性和企业实际产品特征进行筛选&#xff1a;确定您的关键词列表之前&#xff0c;建议先进行市场分析&#xff0c;了解您的竞争对手、行业状况和目标受众等信息&#xff0c;以更好地了解所需的特…

if __name__ == ‘__main__‘详细解释及实操演示

在Python中&#xff0c;每个模块都有一个内置的变量 name&#xff0c;用于表示当前模块的名称。当一个Python文件被执行时&#xff0c;Python解释器会首先将该文件作为一个模块导入&#xff0c;并执行其中的代码。此时&#xff0c;__name__的值为模块的名称。 if name ‘main…