代码随想录-刷题第四十五天

完全背包理论基础

完全背包和0-1背包问题唯一不同的地方就是,完全背包中每种物品有无限个

完全背包和0-1背包在代码上唯一的不同体现在遍历顺序上,直接对两个问题的遍历顺序进行分析。

0-1背包在使用一维dp数组时,是先遍历物品,然后倒序遍历背包容量

01背包中之所以倒序去遍历背包容量,是为了防止重复放入物品。而完全背包中的物品的可以被放入无限次的。所以完全背包中我们的遍历顺序应该是从小到大遍历背包容量

而对于纯完全背包的问题,先遍历物品还是先遍历背包容量都是没有关系的。但是对于特定的应用题目,需要具体来分析应该如何进行遍历。

//先遍历物品,再遍历背包
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

题目链接:518. 零钱兑换 II

思路:本题求的是能够凑成总金额的硬币组合数,硬币数量不限,完全背包解决组合问题

组合不强调元素之间的顺序,排列强调元素之间的顺序

动态规划五步曲:

  1. dp[j]:凑成总金额j的硬币组合数为dp[j]种

  2. 递推公式:dp[j] += dp[j - coins[i]]

  3. 初始化:组合问题,dp[0] = 1。

  4. 遍历顺序:本题是求解组合数,应该先遍历物品,再遍历背包容量。如果是求解排列数,则应该先遍历背包容量,再遍历物品。

  5. 举例推导dp数组

    输入: amount = 5, coins = [1, 2, 5] ,dp状态图如下:

    518.零钱兑换II

    最后红色框dp[amount]为最终结果。

class Solution {public int change(int amount, int[] coins) {// dp[j]:凑成总金额j的硬币组合数为dp[j]种int[] dp = new int[amount + 1];// 初始化,表示金额为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];}
}

377. 组合总和 Ⅳ

题目链接:377. 组合总和 Ⅳ

思路:本题其实是一个求排列的问题。本题只需要求排列总和的个数,可以使用背包,如果要将所有排列列举出来,只能用回溯法暴力搜索。

动态规划五步曲:

  1. dp[i]:凑成目标正整数为i的排列个数为dp[i]

  2. 递推公式为:dp[i] += dp[i - nums[j]]

    排列问题与求组合问题的递推公式相同,遍历顺序不同。

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

    给定目标值是正整数! 所以dp[0] = 1是没有意义的,仅仅是为了推导递推公式。

  4. 遍历顺序:求解排列数问题,先遍历背包容量,再遍历物品。

    如果把遍历nums(物品)放在外循环,遍历target的作为内循环的话,举一个例子:计算dp[4]的时候,结果集只有 {1, 3} 这样的集合,不会有{3, 1}这样的集合,因为nums遍历放在外层,3只能出现在1后面!

  5. 举例推导dp数组

    用示例中的例子推导一下:

    377.组合总和Ⅳ

    如果代码运行出的结果不是想要的,就把dp[i]都打印出来,看看和推导的是否一致。

class Solution {public int combinationSum4(int[] nums, int target) {// dp[i]:凑成目标正整数为i的排列个数为dp[i]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];}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML----JavaScript操作对象BOM对象

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 本章要求 了解BOM模型掌握BOM模型实际应用 一.BOM模型概述 BOM&#xff08;浏览器对象模型&#xff09;是JavaScript中的一个重要概念&#xff0c;它提供了一组用于控制浏览器窗口和页面内容的…

云计算:OpenStack 分布式架构管理FLAT网络(单控制节点与多计算节点)

目录 一、实验 1.环境 2.控制节点创建网络 3.控制节点创建规格 4.控制节点新增安全组入口规则 5.控制节点创建实例 二、问题 1.FLAT网络底层如何实现 2.无法SSH 云主机实例 一、实验 1.环境 (1) 主机 表1 主机 主机架构IP备注controller控制节点192.168.204.210已部…

STM32MP157D-DK1 Qt程序交叉编译与运行测试

上篇文章介绍了STM32MP157D-DK1开发板Qt镜像的构建&#xff0c;通过在Ubuntu中重新编译带有Qt功能的系统来实现。 本篇在上篇的基础上&#xff0c;继续搭建Qt的交叉编译环境&#xff0c;实现Qt程序在Ubuntu中编译&#xff0c;在STM32MP157板子中运行。 1 编译安装SDK 在上篇…

对基于深度神经网络的Auto Encoder用于异常检测的一些思考

一、前言 现实中&#xff0c;大部分数据都是无标签的&#xff0c;人和动物多数情况下都是通过无监督学习获取概念&#xff0c;故而无监督学习拥有广阔的业务场景。举几个场景&#xff1a;网络流量是正常流量还是攻击流量、视频中的人的行为是否正常、运维中服务器状态是否异常…

即插即用篇 | YOLOv8 Gradio 前端展示页面 | 支持 【分类】【检测】【分割】【关键点】 任务

分类任务效果 分割任务效果 检测任务效果 关键点任务效果 使用方法 Gradio 是一个开源库,旨在为机器学习模型提供快速且易于使用的网页界面。它允许开发者和研究人员轻松地为他们的模型创建交互式的演示,使得无论技术背景如何的人都可以方便地试用和理解这些模型。使用Gradi…

从0开始搭建清华ChatGLM3 6b大模型(Windows RTX4090版)

目录 1、硬件及软件说明 2、安装Anaconda 3、安装Git版本控制 ​4、安装pytorch驱动 5、安装ChatGLM3 1、硬件及软件说明 硬件&#xff1a;主要是GPU卡内存要足够&#xff0c;本次搭建使用的RTX4090卡一张&#xff0c;单卡内存24G&#xff0c;为什么选择4090&#xff1f;…

Zookeeper之Java客户端实战

ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有&#xff1a; ZooKeeper官方的Java客户端API。第三方的Java客户端API&#xff0c;比如Curator。 接下来我们将逐一学习一下这两个java客户端是如何操作zookeeper的。 1. ZooKe…

SkyWalking实战与设置警告

日升时奋斗&#xff0c;日落时自省 目录 1、简述 2、Skywalking优越性 2.1、相同产品分析 2.2、Skywalking组成 2.3、Skywalking本质 3、Skywalking服务安装与启动 3.1、ES安装并启动 3.1.2、删除环境变量 3.1.3、预启动ES 3.1.4、关闭HTTPS认证 3.1.5、关闭登录授…

性能优化:Spark SQL中的谓词下推和列式存储

Apache Spark是一个强大的分布式计算框架&#xff0c;Spark SQL是其一个核心模块&#xff0c;用于处理结构化数据。性能优化是大数据处理中的一个关键问题&#xff0c;本文将深入探讨Spark SQL中的两个性能优化技术&#xff1a;谓词下推&#xff08;Predicate Pushdown&#xf…

在实际电路中的二极管

常见有静电保护用的TVS&#xff0c;电源DC-DC上用的续流二极管&#xff0c;稳压管&#xff0c;发光LED二极管等 本文概要&#xff1a; 0. 二极管识图1. TVS二极管2. 整流二极管3. 稳压二极管4. 肖特基二极管5. 快回复二极管6. 续流二极管7. 发光二极管8. 变容二极管9. 小结一…

2022年全球运维大会(GOPS深圳站)-核心PPT资料下载

一、峰会简介 GOPS 主要面向运维行业的中高端技术人员&#xff0c;包括运维、开发、测试、架构师等群体。目的在于帮助IT技术从业者系统学习了解相关知识体系&#xff0c;让创新技术推动社会进步。您将会看到国内外知名企业的相关技术案例&#xff0c;也能与国内顶尖的技术专家…

autograd与逻辑回归

一、autograd—自动求导系统 torch.autograd.backward() torch.autograd.backward()是PyTorch中用于计算梯度的函数。以下是对该函数的参数的解释&#xff1a; 功能&#xff1a;自动求取梯度 • tensors: 用于求导的张量&#xff0c;如 loss • retain_graph : 保存计算图 •…