代码随想录算法训练营第44天| 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ

JAVA代码编写

52. 携带研究材料

题目描述

小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的空间,并且具有不同的价值。

小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料可以选择无数次,并且可以重复选择。

输入描述

第一行包含两个整数,N,V,分别表示研究材料的种类和行李空间

接下来包含 N 行,每行两个整数 wi 和 vi,代表第 i 种研究材料的重量和价值

输出描述

输出一个整数,表示最大价值。

输入示例
4 5
1 2
2 4
3 4
4 5
输出示例
10
提示信息

第一种材料选择五次,可以达到最大值。

数据范围:

1 <= N <= 10000;
1 <= V <= 10000;
1 <= wi, vi <= 10^9.

教程:https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85.html#%E6%80%9D%E8%B7%AF

方法一:动态规划

思路完全背包

有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。

完全背包和01背包问题唯一不同的地方就是,每种物品有无限件

看例子,背包的最大容量是5。

重量价值
物品012
物品124
物品234
物品345

每件物品都有无限个!

01背包和完全背包唯一不同就是体现在遍历顺序上,所以本文就不去做动规五部曲了,我们直接针对遍历顺序经行分析!

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

// 先遍历物品,再遍历背包
for(int i = 0; i < weight.size(); i++) { // 遍历物品
    for(int j = weight[i]; j <= bagWeight ; j++) { // 遍历背包容量
        dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

    }
}

dp状态图如下:

在这里插入图片描述

物品3的重量是4,价值是5,没有房2个物品1价值高,可以不写了。

复杂度分析

  • 时间复杂度:O(n * bagWeight),其中n是物品的数量,bagWeight是背包的容量。
  • 空间复杂度:O(bagWeight),其中bagWeight是背包的容量。
class Solution {
    //先遍历物品,再遍历背包
    private static void testCompletePack(){
        int[] weight = {1, 2, 3, 4};
        int[] value = {2, 4, 4, 5};
        int bagWeight = 5;
        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 + "   ");
        }
    }

    public static void main(String[] args) {
        testCompletePack();
    }
}

这段代码,主要是定义了一个动态规划数组dp,dp的长度是背包的容量加1,然后两个for循环,首先遍历物品,基于之前的01背包我看的代码都是先遍历物品,在背包容量的,这里遍历背包容量的时候,从前往后的,与01背包不同。递归公式和01背包一样。最后输出0-最大容量键最大价值的数。

518.零钱兑换II

给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。

请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0

假设每一种面额的硬币有无限个。

题目数据保证结果符合 32 位带符号整数。

示例 1:

输入:amount = 5, coins = [1, 2, 5]
输出:4
解释:有四种方式可以凑成总金额:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1

示例 2:

输入:amount = 3, coins = [2]
输出:0
解释:只用面额 2 的硬币不能凑成总金额 3 。

示例 3:

输入:amount = 10, coins = [10] 
输出:1

提示:

  • 1 <= coins.length <= 300
  • 1 <= coins[i] <= 5000
  • coins 中的所有值 互不相同
  • 0 <= amount <= 5000

教程:https://programmercarl.com/0518.%E9%9B%B6%E9%92%B1%E5%85%91%E6%8D%A2II.html

方法一:动态规划

思路:给定背包容量amount=5,重量数组给你了coins = [1, 2, 5],每个硬币可以放多次,是完全背包问题。

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

步骤

  1. 定义dp [j]:凑成总金额j的货币组合数为dp[j]

  2. 递推公式:

    dp[j] 就是所有的dp[j - coins[i]](考虑coins[i]的情况)相加。

    dp[0]=1:表示总金额0的货币组合数为dp[0]

    dp[1]:表示总金额1的货币组合数为dp[1]

    dp[2]:表示总金额2的货币组合数为dp[2]

    dp[3]可以从dp[2]加一个1或者从dp[1]加上一个2,所以是个累加的过程

    所以递推公式:dp[j] += dp[j - coins[i]];

  3. dp数组初始化:dp[0] =1

  4. 确定遍历顺序:先遍历物品,在遍历背包容量也就是硬币

  5. 举例推导dp数组,

    以输入:amount = 5, coins = [1, 2, 5]为例

    最后dp数组的状态如下所示:
    在这里插入图片描述

复杂度分析

  • 时间复杂度:O(n * amount),其中n是硬币的数量,amount是目标金额。
  • 空间复杂度:O(amount),其中amount是目标金额。
class Solution {
    public int change(int amount, int[] coins) {
        //递推表达式
        int[] dp = new int[amount + 1];
        //初始化dp数组,表示金额为0时只有一种情况,也就是什么都不装
        dp[0] = 1;
        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];
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.change(5, new int[] {1,2,5});
    }
}

377. 组合总和 Ⅳ

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

示例 1:

输入:nums = [1,2,3], target = 4
输出:7
解释:
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。

示例 2:

输入:nums = [9], target = 3
输出:0

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 1000
  • nums 中的所有元素 互不相同
  • 1 <= target <= 1000

**进阶:**如果给定的数组中含有负数会发生什么?问题会产生何种变化?如果允许负数出现,需要向题目中添加哪些限制条件?

教程:https://programmercarl.com/0377.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C%E2%85%A3.html

方法一:动态规划

思路

步骤

  1. 定义dp [j]:凑成和为target的数字组合数为dp[j]

  2. 递推公式:

    dp[j] 就是所有的dp[j - nums[i]](考虑nums[i]的情况)相加。

    所以递推公式:dp[j] += dp[j - nums[i]];

  3. dp数组初始化:dp[0] =1

  4. 确定遍历顺序:

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

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

  5. 举例推导dp数组,

    以输入:nums = [1,2,3], target = 4为例

    最后dp数组的状态如下所示:

377.组合总和Ⅳ

复杂度分析

  • 时间复杂度:O(n * target)
  • 空间复杂度:O(target)
class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp = new int[target + 1];
        dp[0] = 1;
        for (int i = 0; i <= target; i++) {
            for (int j = 0; j < nums.length; j++) {
                if (i >= nums[j]) {
                    dp[i] += dp[i - nums[j]];
                }
            }
        }
        return dp[target];
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.combinationSum4( new int[] {1,2,3},4);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matplot函数调整子图大小测试

调整subplot()函数的子图间距 import numpy as np import matplotlib.pyplot as plt for i in range(1,7):figsize 10,6plt.subplot(2,3,i)plt.text(0.5,0.5,str((2,3,i)),fontsize18,hacenter) **plt.subplots_adjust(hspace3.3, wspace0.3)** plt.show()import numpy as np…

结构体精讲2

老铁们&#xff0c;有没有坚持每天敲代码呢&#xff1f;坚持做一件事确实很难&#xff0c;但还是要坚定一点咯&#xff01; 接下来我们接着上一期的知识进行讲解&#xff01; 结构体传参 那么对于上述的 print1 和 print2 函数哪个好些&#xff1f; 那么首选是我们的pri…

基于 Flink CDC 构建 MySQL 的 Streaming ETL to MySQL

简介 CDC 的全称是 Change Data Capture &#xff0c;在广义的概念上&#xff0c;只要是能捕获数据变更的技术&#xff0c;我们都可以称之为 CDC 。目前通常描述的 CDC 技术主要面向数据库的变更&#xff0c;是一种用于捕获数据库中数据变更的技术。CDC 技术的应用场景非常广泛…

探索SpringBoot发展历程

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 循序渐进学SpringBoot ✨特色专栏&…

可以彻底告别手写正则表达式了

大家好&#xff0c;我是风筝&#xff0c;公众号「古时的风筝」 这篇文章的目的是让你能得到完美的正则表达式&#xff0c;而且还不用自己拼。 说到正则表达式&#xff0c;一直是令我头疼的问题&#xff0c;这家伙一般时候用不到&#xff0c;等用到的时候发现它的规则是一点儿…

5G入门到精通 - 5G的十大关键技术

文章目录 一、网络切片二、自组织网络三、D2D技术四、低时延技术五、MIMO技术六、毫米波七、内容分发网络八、M2M技术九、频谱共享十、信息中心网络 一、网络切片 5G中的网络切片是一项关键技术&#xff0c;它允许将整个5G网络分割成多个独立的虚拟网络&#xff0c;每个虚拟网络…

超级好用的IDEA插件推荐

IDEA是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作&#xff0c;一般需要打开额外的调试工具。 今天给大家介绍一款IDEA插件&#xff1a;Api…

YOLO的全面综述:从YOLOv1到最新版本

文章目录 摘要1、简介2、YOLO在不同领域的应用3、目标检测的度量标准和非最大值抑制&#xff08;NMS&#xff09;3.1. AP如何工作&#xff1f;3.2. 计算AP3.3、非极大值抑制&#xff08;NMS&#xff09; 4、YOLO: You Only Look Once4.1、YOLOv1的工作原理4.2、YOLOv1架构4.3、…

Xilinx FPGA——ISE时序约束“建立时间不满足”问题解决记录

一、现象 最近使用赛灵思的FPGA设计项目时&#xff0c;出现时序约束失效问题。 点进去发现如下&#xff1a; 一个始终约束没有生效&#xff0c;有多处报错。 二、原因 出现这个问题的原因是&#xff0c;建立时间不满足。 时序违例的主要原因是建立时间和保持时间不满足要求&a…

用23种设计模式打造一个cocos creator的游戏框架----(九)访问者模式

1、模式标准 模式名称&#xff1a;访问者模式 模式分类&#xff1a;行为型 模式意图&#xff1a;将数据操作与数据结构分离&#xff0c;使得在不修改数据结构的前提下&#xff0c;可以添加或改变对数据的操作。 结构图&#xff1a; 适用于&#xff1a; 当你需要对一个复杂对…

Dockerfile详解#如何编写自己的Dockerfile

文章目录 前言编写规则指令详解FROM&#xff1a;基础镜像LABEL&#xff1a;镜像描述信息MAINTAINER&#xff1a;添加作者信息COPY&#xff1a;从宿主机复制文件到镜像中ADD&#xff1a;从宿主机复制文件到镜像中WORKDIR&#xff1a;设置工作目录 前言 Dockerfile是编写docker镜…

Spring AOP从入门到精通

目录 1. AOP的演化过程 1. 代理模式 2. 动态代理 2.1 JDK动态代理 2.2 Cglib动态代理 3. Spring模式 3.1 ProxyFactory 3.2 ProxyFactoryBean 3.3 AbstractAutoProxyCreator 2. Spring AOP抽象 1. 核心术语 1.1 连接点(JoinPoint) 1.2 切点(Pointcut) 1.3 增强(Ad…

JAVA 多线程并发(一)

1.JAVA 并发知识库 2.JAVA 线程实现/创建方式 2.1. 继承 Thread 类 Thread 类本质上是实现了 Runnable 接口的一个实例&#xff0c;代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法&#xff0c;它将启动一个新线…

使用JMeter创建数据库测试

好吧&#xff01;我一直觉得我不聪明&#xff0c;所以&#xff0c;我用最详细&#xff0c;最明了的方式来书写这个文章。我相信&#xff0c;我能明白的&#xff0c;你们一定能明白。 我的环境&#xff1a;MySQL&#xff1a;mysql-essential-5.1.51-win32 jdbc驱动&#xff1a…

支持生成接口文档!Apipost IDEA插件使用体验

前言 Idea 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序,Idea 还具有许多插件和扩展&#xff0c;可以根据开发人员的需要进行定制和扩展&#xff0c;从而提高开发效率,今天我们就来介绍一款…

交易历史记录20231207 记录

昨日回顾&#xff1a; select top 10000 * from dbo.全部&#xff21;股20231207_ALL where 连板天 >1 and DDE大单净量>0 and DDE散户数量<0 and RSI> 80 and 五指标共振>0 and 涨停基因>20 and CONVERT(datetime,最后涨停时间,120) <CONVERT(d…

富时中国A50指数暴跌

近年来&#xff0c;中国股市的波动一直备受关注&#xff0c;而富时中国A50指数更是其中一项备受瞩目的指标之一。然而&#xff0c;近期却出现了一场引人瞩目的暴跌&#xff0c;引发了广泛的关注和讨论。 富时中国A50指数简介 富时中国A50指数&#xff0c;作为富时罗素指数系列…

Linux:缓冲区的概念理解

文章目录 缓冲区什么是缓冲区&#xff1f;缓冲区的意义是什么&#xff1f;缓冲区的刷新方式 理解缓冲区用户缓冲区和内核缓冲区缓冲区在哪里&#xff1f; 本篇主要总结的是关于缓冲区的概念理解&#xff0c;以及再次基础上对文件的常用接口进行一定程度的封装 缓冲区 什么是缓…

linux文件查找

grep: 文件内容过滤 [rootzaotounan ~]# grep 文件内容 路径 #从某个路径下的文件中过滤拥有文件内容的字段 ​ [rootzaotounan ~]# grep -r #递归查找 查找命令配置文件位置 查找命令位置 [rootzaotounan ~]# which 命令名 ​ 查找配置文件位置 [rootzaotounan ~]# wherei…

el-select的多选multible带全选组件二次封装(vue2,elementUI)

1.需求 Select 选择器 多选需要增加 全选 和 取消全选 功能&#xff0c;前端框架为vue2&#xff0c;UI组件为elementUI。 2. 代码 html部分 <template><el-tooltip effect"dark" :disabled"defaultValue.length < 0" :content"defaul…
最新文章