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

本文主要是介绍代码随想录算法训练营第四十三天 | 完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

完全背包理论基础

题目链接:https://kamacoder.com/problempage.php?pid=1052
文档讲解:https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F…
视频讲解:https://www.bilibili.com/video/BV1uK411o7c9/

思路

完全背包中,每个物品可以使用无限次。遍历顺序为顺序遍历物品和顺序遍历背包,并且两个for循环可以交换顺序。

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]);}
}

代码

import java.util.*;public class Main{public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int bagWeight = in.nextInt();int[] weight = new int[n];int[] value = new int[n];for (int i = 0; i < n; i++) {weight[i] = in.nextInt();value[i] = in.nextInt();}int[] dp = new int[bagWeight + 1];for (int i = 0; i < n; i++) {for (int j = weight[i]; j <= bagWeight; j++) {dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);}}System.out.println(dp[bagWeight]);}
}

518.零钱兑换II

题目链接:https://leetcode.cn/problems/coin-change-ii/
文档讲解:https://programmercarl.com/0518.%E9%9B%B6%E9%92%B1%E5%85%91%E6%8D…
视频讲解:https://www.bilibili.com/video/BV1KM411k75j/

思路

  • 确定dp数组以及下标的含义:凑成j块钱有dp[j]种方法。
  • 确定递推公式:计算方法数要用累加,公式为dp[j] += dp[j - coins[i]];
  • dp数组如何初始化:dp[0] = 1;,否则累加出来都是0。
  • 确定遍历顺序:完全背包问题中,物品和背包都是正序遍历。本题要求的是组合数,需要先遍历物品,再遍历背包;如果是求排列数,就需要先遍历背包,再遍历物品。
  • 打印dp数组,用于debug

代码

class Solution {public int change(int amount, int[] coins) {int[] dp = new int[amount + 1];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];}
}

分析:时间复杂度:O(mn),空间复杂度:O(m)。其中 m 是 amount,n 是 coins 的长度。

377. 组合总和 Ⅳ

题目链接:https://leetcode.cn/problems/combination-sum-iv/
文档讲解:https://programmercarl.com/0377.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C%E2%85%A3.html
视频讲解:https://www.bilibili.com/video/BV1V14y1n7B6/

思路

  • 确定dp数组以及下标的含义:能够凑成目标整数j的组合数为dp[j]
  • 确定递推公式:计算方法数要用累加,公式为dp[j] += dp[j - nums[i]];
  • dp数组如何初始化:dp[0] = 1;,否则累加出来都是0。
  • 确定遍历顺序:完全背包问题中,物品和背包都是正序遍历。本题要求的是排列数,需要先遍历背包,再遍历物品;如果是求组合数,就需要先遍历物品,再遍历背包。
  • 打印dp数组,用于debug

代码

class Solution {public int combinationSum4(int[] nums, int target) {int[] dp = new int[target + 1];dp[0] = 1;for (int j = 0; j <= target; j++) {for (int i = 0; i < nums.length; i++) {if (j >= nums[i]) dp[j] += dp[j - nums[i]];}}return dp[target];}
}

分析:时间复杂度:O(mn),空间复杂度:O(m)。其中m是target,n是nums的长度。

70. 爬楼梯 (进阶)

题目链接:https://kamacoder.com/problempage.php?pid=1067
文档讲解:https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF%E5%AE%8C%E5%85%A8%E8%83%8C%E5…

思路

  • 确定dp数组以及下标的含义:爬j阶台阶的方法有dp[j]种。
  • 确定递推公式:计算方法数要用累加,公式为dp[j] += dp[j - i];
  • dp数组如何初始化:dp[0] = 1;,否则累加出来都是0。
  • 确定遍历顺序:完全背包问题中,物品和背包都是正序遍历。本题要求的是排列数,需要先遍历背包,再遍历物品;如果是求组合数,就需要先遍历物品,再遍历背包。
  • 打印dp数组,用于debug

代码

import java.util.*;public class Main{public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int m = in.nextInt();int[] dp = new int[n + 1];dp[0] = 1;for (int j = 0; j <= n; j++) {for (int i = 1; i <= m; i++) {if (j >= i) dp[j] += dp[j - i];   }}System.out.println(dp[n]);}
}

分析:时间复杂度:O(mn),空间复杂度:O(n)。

这篇关于代码随想录算法训练营第四十三天 | 完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076900

相关文章

随想录 Day 69 并查集 107. 寻找存在的路径

随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好vector<int> father = vector<int> (n, 0); // C++里的一种数组结构// 并查集初始化void init() {for (int i = 0; i < n; ++i) {father[i] = i;}

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

mysql索引四(组合索引)

单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引;组合索引,即一个索引包含多个列。 因为有事,下面内容全部转自:https://www.cnblogs.com/farmer-cabbage/p/5793589.html 为了形象地对比单列索引和组合索引,为表添加多个字段:    CREATE TABLE mytable( ID INT NOT NULL, use

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

ps基础入门

1.基础      1.1新建文件      1.2创建指定形状      1.4移动工具          1.41移动画布中的任意元素          1.42移动画布          1.43修改画布大小          1.44修改图像大小      1.5框选工具      1.6矩形工具      1.7图层          1.71图层颜色修改          1