代码随想录算法训练营第四十四天|完全背包理论基础 、518. 零钱兑换 II 、377. 组合总和 Ⅳ

news2025/1/21 12:16:31

文章目录

      • 完全背包理论基础
      • 518. 零钱兑换 II
      • 377. 组合总和 Ⅳ

完全背包理论基础

  • 纯背包问题的特点:每个物品可以无限次拿

  • 与0-1背包唯一不同:

    完全背包的物品是可以添加多次的,所以要从小到大去遍历

    0-1背包不可以添加多次,需要从大到小去遍历

    2023-04-27T18_52_54

    Snipaste_2023-04-27_18-49-17
  • 对于纯完全背包问题,其for循环的先后循环是可以颠倒的
    但如果题目稍稍有点变化,就会体现在遍历顺序上。
    如果问装满背包有几种方式的话? 那么两个for循环的先后顺序就有很大区别了,而leetcode上的题目都是这种稍有变化的类型。

  • 先遍历背包的话,注意背包的索引要从0开始(注意)

//先遍历物品,再遍历背包
private static void testCompletePack(){
    int[] weight = {1, 3, 4};
    int[] value = {15, 20, 30};
    int bagWeight = 4;
    int[] dp = new int[bagWeight + 1];
    for (int i = 0; i < weight.length; i++){ // 遍历物品
        for (int j = weight[i]; j <= bagWeight; j++){ // 遍历背包容量
            dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
        }
    }
    for (int maxValue : dp){
        System.out.println(maxValue + "   ");
    }
}

//先遍历背包,再遍历物品
private static void testCompletePackAnotherWay(){
    int[] weight = {1, 3, 4};
    int[] value = {15, 20, 30};
    int bagWeight = 4;
    int[] dp = new int[bagWeight + 1];
    for (int i = 1; i <= bagWeight; i++){ // 遍历背包容量
        for (int j = 0; j < weight.length; j++){ // 遍历物品
            if (i - weight[j] >= 0){
                dp[i] = Math.max(dp[i], dp[i - weight[j]] + value[j]);
            }
        }
    }
    for (int maxValue : dp){
        System.out.println(maxValue + "   ");
    }
}

518. 零钱兑换 II

与目标和的题目很相似,就是求装满容量的组合数

本题物品的容量和价值的含义一样的

本题学到东西:①组合和排列问题不同遍历顺序②背包问题变型思路

  • 题目链接:代码随想录

  • 背包问题变型思路

    纯完全背包是凑成背包最大价值是多少,而本题是要求凑成总金额的物品组合个数

    递推公式不同于dp[j] = max(dp[j],dp[j - weight[i]] + value[i]),而是dp[j] += dp[j - coins[i]],-这是一个求装满容器有多少种方法的模板

  • 解题思路:
    1.dp[j]:凑成总金额j的货币组合数为dp[j]
    2.dp[j] += dp[j - coins[i]];
    3.dp[0]一定要为1。如果dp[0] = 0 的话,后面所有推导出来的值都是0了。
    4.遍历顺序:一定要先遍历背包

    2023-04-27T19_48_05

  • 推导过程:

    Snipaste_2023-04-27_19-49-07

class Solution {
    public int change(int amount, int[] coins) {

        //dp[i]表示装满容量为i的背包有几种方法
        //i代表容量
        int[] dp = new int[amount + 1];//定义背包

        //2.初始化
        dp[0] = 1;

        //3.遍历
        for (int i = 0; i < coins.length; i++) {//先遍历物品

            for (int j = coins[i]; j <= amount; j++) { //遍历背包
                dp[j] += dp[j - coins[i]];
            }
        }

        return dp[amount];

    }   
}

377. 组合总和 Ⅳ

  • 题目链接:代码随想录

跟上一题对比来看

如果求组合数就是外层for循环遍历物品,内层for遍历背包。

如果求排列数就是外层for遍历背包,内层for循环遍历物品。

  • 解题思路:
    注意遍历顺序即可,其他思路同上。
    ①先遍历背包再遍历物品,遍历物品的时候要从头开始遍历,可以想象成是竖着遍历
    ②在判断当前背包能装下物品时,对dp数组进行修改时,索引为i表示当前背包,因为dp[i]表示为装满重量为i的背包,能有几种组合

  • 推导过程:

    image-20230427203542459

public int combinationSum4(int[] nums, int target) {

    //1.dp[i]表示为装满重量为i的背包,能有几种组合
    int[] dp = new int[target + 1];

    //2.初始化
    dp[0] = 1;

    for (int i = 0; i <= target; i++) {//先遍历背包

        for (int j = 0; j < nums.length; j++) {//再遍历物品,j要从nums[0]开始,因为每一个物品都有可能装进背包和 先遍历物品的情况区别开来

            if(i >= nums[j]){
                dp[i] += dp[i - nums[j]];//这里dp[i]的索引不能错,因为是同一个i表示背包
            }
        }
    }

    return dp[target];

}

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

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

相关文章

【C++】类和对象(上篇)

类和对象 面向过程和面向对象初步认识类的引入类的定义命名规范类的访问限定符及封装访问限定符封装 类的作用域类的实例化类的对象大小的计算类成员函数的this指针this指针的引出this指针的特性 面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#…

RocketMQ-Producer

消息生产者的代码都在client模块中&#xff0c;相对于RocketMQ来讲&#xff0c;消息生产者就是客户端&#xff0c;也是消息的提供者。 启动流程 代码&#xff1a;DefaultMQProducerImpl#start public void start(final boolean startFactory) throws MQClientException {switc…

轻松掌握消息队列RabbitMQ在SpringAMQP中的实践知识点

1、介绍 spring集成了rabbitmq&#xff0c;可以对rabbitmq先进行安装简单了解。参考我的rabbitmq文章。 2、使用 1、基本消息队列BasicQueue案例 一个消息消费者&#xff0c;上个消息未处理完&#xff0c;队列中的消息将阻塞&#xff0c;导致内存泄漏 1、引入AMQP依赖 2、添…

读书:《科技论文写作与发表教程(第6版)》

科技写作是指以符合标准格式的科技论文形式在科技期刊上陈述原创性的研究。 另外&#xff0c;还有广义上的科技写作。 科技写作的最主要特点是表达清晰。科技写作不需要漂亮的文学修饰&#xff0c;要把信息清楚地传递给读者。 IMRAD格式&#xff1a;Introduction Methods Re…

Redis常见问题整理

一、Redis使用场景相关问题 0. 单机版Redis部署 系统环境&#xff1a;CentOS7 1、下载Redis所需要的镜像 yum install -y gcc tcl2、下载redis安装包 mkdir /soft cd /soft wget https://download.redis.io/releases/redis-6.2.4.tar.gz3、解压缩&#xff1a; tar -xvf redi…

QT-DAY3

实现ui 字体、颜色、保存文件、打开文件 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//字体按钮对应的槽函数 void Wid…

性能测试技术笔记:如何设计一个压测平台 ?

目录 为什么需要压测平台&#xff1f; 压测平台功能设计思路 压测平台技术实现方案 总结 为什么需要压测平台&#xff1f; 从实际工作场景出发&#xff0c;如果只有一两个人做性能测试工作&#xff0c;那其实没必要开发专门的压测平台&#xff0c;原因如下&#xff1a; 成…

【备战秋招】权限常见面试题

本文的面试题和答案均为本人自己收集&#xff0c;如有错误或者不足&#xff0c;欢迎大家指出 目录 你做过的系统&#xff0c;权限是怎么管理的 Shiro是靠什么做认证和授权的 什么是RBAC模型 如果让你手写一个Web过滤器验证权限&#xff0c;你会怎么写 Shiro的anon和authc都…

锅炉燃烧自动控制系统

串级控制 以外环温度、内环煤气流量为例 重点1 主PID输出0~100需要经过线性转换模块进行转换&#xff0c;转换成与煤气流量相同量纲才能作为副PID的设定值。假设煤气流量量程100000&#xff1b;则副PID设定值如下&#xff1a; secSET mainLMN/100*100000&#xff1b; 重点2…

创造者基金 2023 年 4 月亮点

隆重推出创作者基金的 2023 年 4 月亮点 NFT 系列——一系列令人着迷且令人惊叹的数字资产&#xff0c;让大家为之震撼&#xff01;该系列的角色令人惊叹&#xff0c;包括阿兹特克酋长、维京战士、残酷的国王、传奇的九尾狐等等&#xff0c;是收藏家和爱好者的必备之物。 无论你…

优化 | 随机原始对偶混合梯度(SPDHG)算法及在图像处理中的应用

论文解读者&#xff1a;陈宇文&#xff0c;胡明杰&#xff0c;史铭伟&#xff0c;赵田田 许多实际问题都可以建模为凸优化问题。相比于直接求解原问题&#xff0c;将问题转化为鞍点问题往往会带来好处。求解鞍点问题的一种常用算法是原对偶混合梯度算法 (PDHG)&#xff0c;它在…

ubuntu-server22.04编译Redis7.0.11源码支持TLS

1.克隆redis源码: git clone https://github.com/redis/redis.git 编译前确认已安装GCC11与G++11和cmake及make及pkg-config 安装命令如下: apt install gcc -y apt install g++ -y apt install cmake -y apt install pkg-config 因为要支持TLS所以要安装OPENSSL开发库 ap…

阿里云CPFS与OSS之间数据双向流动机制

随着云上对象存储成本的逐渐降低&#xff0c;越来越多的企业利用阿里云OSS存储他们的大量数据并构建数据湖。现在阿里云文件存储CPFS与对象存储OSS实现了深度集成&#xff0c;客户可以在三十分钟内创建一个高性能CPFS文件系统并链接到他们的OSS bucket。当链接到OSS bucket以后…

实验二 ROS结合OpenCV示例——人脸识别

ROS结合OpenCV示例——人脸识别 一、实验原理&#xff1a;二、实验步骤&#xff1a;<1> 安装opencv 以及串口功能包<2> 测试opencv串口是否安装成功 三、程序分析&#xff1a; 一、实验原理&#xff1a; Opencv库是一个基于BSD许可发行的跨平台开源计算机视觉库&a…

STM32WB55_NUCLEO开发(9)----接收手机数据点亮LED

概述 本篇文章主要介绍如何使用STM32CubeMX对生成STM32WB工程&#xff0c;并通过与STM32WB配对&#xff0c;向该特征写入一个任意字节&#xff0c;绿色LED会切换。 硬件准备 首先需要准备一个开发板&#xff0c;这里我准备的是NUCLEO-WB55RG 的开发板&#xff1a; 选择芯片…

加拿大各省接受公立教育的初始年龄汇总 — 供携子女赴加的访学、博后参考

近年来到加拿大从事访问学者和博士后研究的申请者日益增多&#xff0c;有些申请者想带孩子同去上公立学校。因为加拿大各省教育局政策有差异&#xff0c;所以入学&#xff08;包括学前班&#xff09;年龄不同&#xff0c;为此知识人网小编整理本文为大家解惑答疑。 加拿大为本国…

GitHub Actions自动发布Package到Pub.dev

一、创建package或plugin 先创建一个package或者plugin 二、手动上传第一个版本到pub.dev flutter packages pub publish --serverhttps://pub.dartlang.org 三、在admin配置自动化发布 打开pub.dev中的对应的package按照以下图片配置 四、在项目跟目录配置发布脚本 1、在…

XMLMapperBuilder解析*mapper.xml

springboot的MybatisAutoConfiguration自动配置类会创建SqlSessionFactory&#xff0c;创建过程就是填充configuration属性&#xff0c;调用buildSqlSessionFactory()方法完成SqlSessionFactory创建&#xff0c;这其中就会创建XMLMapperBuilder解析mapper.xml和XMLConfigBuilde…

UHD在DPDK下进行编译

1.安装choco windows环境,用管理员权限打开 powershell 命令行界面。 输入命令:Set-ExecutionPolicy AllSigned 继续输入命令:Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]…

C++---区间DP/高精度计算---凸多边形的划分(每日一道算法2023.4.27)

注意事项&#xff1a; 本题是"区间DP—能量项链"的扩展题&#xff0c;可以先理解下那道题。 本题使用了"高精度乘法"和"高精度加法"&#xff0c;可以去这两篇文章看&#xff0c;有详解。 题目&#xff1a; 给定一个具有 N 个顶点的凸多边形&…