当前位置: 首页 > news >正文

每日OJ题_完全背包④_力扣279. 完全平方数(一维和二维)

目录

力扣279. 完全平方数

问题解析

解析代码

优化代码(相同子问题分析和滚动数组)


力扣279. 完全平方数

279. 完全平方数

难度 中等

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,149 和 16 都是完全平方数,而 3 和 11 不是。

示例 1:

输入:n = 12输出:3 
解释:12 = 4 + 4 + 4

示例 2:

输入:n = 13输出:2
解释:13 = 4 + 9

提示:

  • 1 <= n <= 10^4
class Solution {
public:int numSquares(int n) {}
};

问题解析

(优化代码部分放了分析一维空间的思路,这个普通思路就简单描述了)

状态表示: dp[i][j] 表示:从前i个完全平方数中挑选,总和正好等于j,所有选法中最小的数量。

状态转移方程:

        线性 dp 状态转移方程分析方式,一般都是根据最后一步的状况,来分情况讨论。但是最后一个物品能选很多个,因此需要分很多情况:

  • 选 0 个i * i:dp[i][j] = dp[i - 1][j] 
  • 选 1 个i * i:dp[i][j] = dp[i - 1][j - i * i] + 1 ;
  • 选 2 个i * i:dp[i][j] = dp[i - 1][j - 2 * i * i] + 2 ;
  • ......

综上,状态转移方程为:

dp[i][j] = min(dp[i - 1][j] , dp[i - 1][j - i * i] + 1 + dp[i - 1][j - 2 * i * i] + 2 ,  ......)

        这时发现,计算一个状态的时候,需要一个循环才能搞定的时候,我们要想到去优化。优化的方向就是用一个或者两个状态来表示这一堆的状态,通常就是用数学的方式做一下等价替换。

        发现第二维是有规律的变化的,因此去看看 dp[i][j - i * i] + 1 ; 这个状态: dp[i][j - i * i] + 1 = min( dp[i - 1][j - 2 * i * i] + 2 , dp[i - 1][j - 3 * i * i] + 3  ,  ......)

        因此可以修改我们的状态转移方程为: dp[i][j] = min(dp[i - 1][j] , dp[i][j - i * i] + 1。(j >= i * i )。有个技巧,就是相当于把第二种情况 dp[i - 1][j - i * i] + 1 里面的 i - 1 变成 i 即可。

初始化: 初始化第一行即可,dp[0[0]为1,第一行后面初始化成无穷大。

填表顺序: 根据状态转移方程,仅需从上往下填表。

返回值: 根据状态表示,返回 dp[根号n][n] 。


解析代码

class Solution {
public:int change(int amount, vector<int>& coins) {int n = coins.size();vector<int> dp(amount + 1, 0); // 滚动数组优化dp[0] = 1;for(int i = 1; i <= n; ++i){for(int j = coins[i - 1]; j <= amount; ++j){dp[j] = dp[j] + dp[j - coins[i - 1]];}}return dp[amount];}
};

优化代码(相同子问题分析和滚动数组)

        先看能不能将问题转化成我们熟悉的题型。这里给出一个用拆分出相同子问题的方式,定义一个状态表示。(得到的结果 i 和 j 换一下就是滚动数组优化的结果)

为了叙述方便,把和为 n 的完全平方数的最少数量简称为最小数量

对于 12 这个数,分析一下如何求它的最小数量。

  • 如果 12 本身就是完全平方数,就不用算了,直接返回 1 ;
  • 但是 12 不是完全平方数,试着把问题分解⼀下:
  1. 情况一:拆出来一个 1 ,然后看看 11 的最小数量,记为 x1 ;
  2. 情况二:拆出来一个 4 ,然后看看 8 的最小数量,记为 x2 ;(为什么拆出来 4 , 而不拆出来 2 呢?)
  3. 情况三:拆出来一个 8 ...... 其中,接下来求 11、8 的时候,其实又回到了原来的问题上。

        因此,可以尝试用 dp 的策略,将 1 2 3 4 6 等等这些数的最小数量依次保存起来。再求较大的 n 的时候,直接查表,然后找出最小数量。

状态表示: dp[i] 表示:和为 i 的完全平方数的最少数量。

状态转移方程:

        对于 dp[i] ,根据思路里的分析知道,可以根据小于等于 i 的所有完全平方数 x 进行划分:

  • x = 1 时,最小数量为: 1 + dp[i - 1] ;
  • x = 4 时,最小数量为: 1 + dp[i - 4] ......

为了方便枚举完全平方数,采用的策略: for(int j = 1; j * j <= i; j++)

综上,状态转移方程为:

dp[i] = min(dp[i], dp[i - j * j] + 1)

初始化:当 n = 0 的时候,没法拆分,结果为 0 ; 当 n = 1 的时候,结果为 1 。

填表顺序: 根据状态转移方程,仅需从左往右填表。

返回值: 根据状态表示,返回 dp[n] 。

class Solution {
public:int numSquares(int n) {// dp[i] 表示:和为 i 的完全平方数的最少数量int m = sqrt(n);vector<int> dp(n + 1, 0x3f3f3f3f);dp[0] = 0;for(int i = 1; i <= m; ++i){for(int j = i * i; j <= n; ++j){dp[j] = min(dp[j], dp[j - i * i] + 1);}}return dp[n];}
};

相关文章:

每日OJ题_完全背包④_力扣279. 完全平方数(一维和二维)

目录 力扣279. 完全平方数 问题解析 解析代码 优化代码&#xff08;相同子问题分析和滚动数组&#xff09; 力扣279. 完全平方数 279. 完全平方数 难度 中等 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值…...

web项目中jsp页面不识别el表达式

如果使用el表达式出现下图问题 ** 解决办法 ** 这是因为maven创建项目时&#xff0c;web.xml头部声明默认是2.3&#xff0c;这个默认jsp关闭el表达式 修改web.xml文件开头的web-app的版本 <?xml version"1.0" encoding"UTF-8"?> <web-app x…...

【Python基础】字典

文章目录 [toc]什么是字典键值对示例键异常 遍历列表什么是遍历遍历字典的键keys()方法 遍历字典的值values()方法 遍历字典的键值对items()方法 字典操作增加键值对修改键值对查询键值对get()方法 删除键值对delclear()方法 个人主页&#xff1a;丷从心 系列专栏&#xff1a;…...

2024HW --> 安全产品 Powershell无文件落地攻击

在HW中&#xff0c;除了了解中间件&#xff0c;web漏洞&#xff0c;这些攻击的手法&#xff0c;还得了解应急响应&#xff0c;安全产品&#xff0c;入侵排查&#xff0c;溯源反制...... 那么今天&#xff0c;就来说一下安全产品&#xff08;安全公司我就不说了&#xff0c;这个…...

力扣哈哈哈哈

public class MyStack {int top;Queue<Integer> q1;Queue<Integer> q2;public MyStack() {q1new LinkedList<Integer>();q2new LinkedList<Integer>();}public void push(int x) {q2.offer(x);//offer是入队方法while (!q1.isEmpty()){q2.offer(q1.pol…...

RUM 最佳实践-视觉稳定性的探索与实践

写在前面的话 在当今数字时代&#xff0c;网页的视觉稳定性对于提供良好的用户体验至关重要。其中一个衡量视觉稳定性的关键指标就是累积布局偏移&#xff08;Cumulative Layout Shift&#xff0c;简称 CLS&#xff09;。CLS 作为 Web Vitals 指标之一&#xff0c;它衡量的是网…...

PostgreSQL的学习心得和知识总结(一百三十八)|深入理解PostgreSQL数据库之Protocol message构造和解析逻辑

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…...

爬虫开发教程

一、爬虫概述 爬虫&#xff08;也称为网络爬虫或蜘蛛&#xff09;是一种自动化程序&#xff0c;能够模拟人类在互联网上浏览和抓取数据的行为。它通过发送HTTP请求&#xff0c;获取网页的HTML代码&#xff0c;然后解析这些代码以提取有用的数据。爬虫在数据分析、价格监测、竞…...

【Python】高级进阶(专版提升3)

Python 1 程序结构1.1 模块 Module1.1.1 定义1.1.2 作用1.1.3 导入1.1.3.1 import1.1.3.2 from import 1.1.4 模块变量1.1.5 加载过程1.1.6 分类 1.2 包package1.2.1 定义1.2.2 作用1.2.3 导入1.1.3.1 import1.1.3.2 from import 2 异常处理Error2.1 异常2.2 处理 3 迭代3.1 可…...

LeetCode 1378、1277、2944

1378 二级排序&#xff0c;compare函数必须是static的 class Solution { public:struct node {int val;int priority;};static bool compare(const node &n1, const node &n2) {if (n1.priority n2.priority) {return n1.val < n2.val;}return n1.priority < n…...

【缓存常见问题】

在使用缓存时特别是在高并发场景下会遇到很多问题&#xff0c;常用的问题有缓存穿透、缓存击穿、缓存雪崩以及缓存一致性问题。 1、缓存穿透 首先&#xff0c;什么是缓存穿透呢&#xff1f; 缓存穿透是指请求一个不存在的数据&#xff0c;缓存层和数据库层都没有这个数据&…...

Python爬取猫眼电影票房 + 数据可视化

目录 主角查看与分析 爬取可视化分析猫眼电影上座率前10分析猫眼电影票房场均人次前10分析猫眼电影票票房占比分析 主角查看与分析 爬取 对猫眼电影票房进行爬取&#xff0c;首先我们打开猫眼 接着我们想要进行数据抓包&#xff0c;就要看网站的具体内容&#xff0c;通过按F12…...

Spring Boot深度解析:是什么、为何使用及其优势所在

在Java企业级应用开发的漫长历史中&#xff0c;Spring框架以其卓越的依赖注入和面向切面编程的能力&#xff0c;赢得了广大开发者的青睐。然而&#xff0c;随着技术的不断进步和项目的日益复杂&#xff0c;传统的Spring应用开发流程逐渐显得繁琐和低效。为了解决这一问题&#…...

面向对象——类与对象

文章目录 类与对象构造函数、析构函数get/set方法函数&#xff1a;类内声明、类外定义static 类与对象 #include<iostream> #include<string> using namespace std; /* 类与对象 */ class Person{public:string name;// 固有属性&#xff0c;成员变量 int age;pu…...

Golang的[]interface{}为什么不能接收[]int?

在 Go 中&#xff0c;[]interface{} 和 []int 是两种不同的类型&#xff0c;虽然它们的底层数据结构都是切片&#xff0c;但是它们的元素类型不同。[]interface{} 是一个空接口切片&#xff0c;可以容纳任意类型的元素&#xff0c;而 []int 是一个整数切片&#xff0c;只能容纳…...

重启服务器或重启docker,导致emqx的Dashboard的密码重置为public

最近在项目中突然发现重启服务器,或者重启docker 修改好的emqx的Dashboard的密码重置为public 技术博客 http://idea.coderyj.com/ 1.解决办法就是固定 emqx的节点 # 拉取镜像 docker pull emqx/emqx# 创建目录&#xff0c;进行目录挂载 mkdir -p /docker/emqx/{etc,lib,data,…...

就业班 第三阶段(ansible) 2401--4.16 day2 ansible2 剧本+角色

六、Ansible playbook 简介 playbook 是 ansible 用于配置&#xff0c;部署&#xff0c;和管理被控节点的剧本。   通过 playbook 的详细描述&#xff0c;执行其中的一系列 tasks &#xff0c;可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的…...

常用的过滤网站扫描网站攻击的路径是那些,比如:/etc/passwd等

网站攻击中经常被尝试的路径主要包括利用漏洞获取敏感文件、执行系统命令或者注入恶意代码的尝试。以下是一些常见的被攻击者尝试访问的路径和文件&#xff0c;这些通常在网络入侵检测系统&#xff08;IDS&#xff09;和网络防火墙的过滤规则中被特别关注&#xff1a; 系统文件…...

考研数学|《1800》《660》《880》如何选择和搭配?(附资料分享)

直接说结论&#xff1a;基础不好先做1800、强化之前660&#xff0c;强化可选880/1000题。 首先&#xff0c;传统习题册存在的一个问题是题量较大&#xff0c;但难度波动较大。《汤家凤1800》和《张宇1000》题量庞大&#xff0c;但有些题目难度不够平衡&#xff0c;有些过于简单…...

论文笔记:Are Human-generated Demonstrations Necessary for In-context Learning?

iclr 2024 reviewer 评分 6668 1 intro 大型语言模型&#xff08;LLMs&#xff09;已显示出在上下文中学习的能力 给定几个带注释的示例作为演示&#xff0c;LLMs 能够为新的测试输入生成输出然而&#xff0c;现行的上下文学习&#xff08;ICL&#xff09;范式仍存在以下明显…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...