LeetCode279. 完全平方数 DP完全背包

MuJoCo 关节角速度记录与可视化,监控机械臂运动状态 1. 手动计算关节速度,其中timestep为仿真步长。2. 使用data.qvel直接取得关节速度。 阅读详情

题目描述

  • 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量。
    完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
示例 1:

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

输入:n = 13
输出:2
解释:13 = 4 + 9
class Solution {
public:
    int numSquares(int n) {

    }
};

完全背包

  • 恰好装满之类的01背包问题,竖向i是物品,横向j是容量。 i为前i件物品,容量j可以为0,算法主题为遍历i,j 。
    由于无后效性,只知道nums[i],需要判断j-nums[i]能做什么。
    j-nums[i]为装了当前物品剩余的空间。dp[ i-1][j-nums[i]]为这点空间能做的事情。如果最大化利润则为以下公式:
    d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − w i ] + v i ) dp[i][j]=max(dp[i−1][j],dp[i][j−w _i ]+v_i ) dp[i][j]=max(dp[i−1][j],dp[i][j−wi​]+vi​)

  • 完全背包每次还是考虑当前项,只不过可以拿多个,那我们可以加个循环k
    d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − w i ∗ k ] + v i ) dp[i][j]=max(dp[i−1][j],dp[i-1][j−w _i\color{red}*k\color{black} ]+v_i ) dp[i][j]=max(dp[i−1][j],dp[i−1][j−wi​∗k]+vi​)

  • 实际上j是从小到大遍历的,所以可以用
    d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − w i ] + v i ) dp[i][j]=max(dp[i−1][j],dp[\color{red}i\color{black}][j−w _i ]+v_i ) dp[i][j]=max(dp[i−1][j],dp[i][j−wi​]+vi​)
    省略掉一个循环

  • 0-1背包如果压缩维度dp[i][j-nums[i]],但是j需要倒序遍历。

完全背包

        完全背包是一类经典的背包问题,与0/1背包问题和多重背包问题不同。其中,每个物品可以被无限次地选择放入背包。也就是说,每个物品的数量是无限的。

        假设有一个容量为 V V V的背包,现在有 n n n个物品,每个物品的体积为 w i w_i wi​,价值为 v i v_i vi​,同时每个物品的数量是无限的。问能够放入背包的最大价值是多少?

        完全背包问题可以通过动态规划求解,时间复杂度为 O ( n V ) O(nV) O(nV)。可以用一个二维数组 d p [ i ] [ j ] dp[i][j] dp[i][j]来表示前 i i i个物品放入容量为 j j j的背包中获得的最大价值。其中,状态转移方程为 d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − w i ] + v i ) dp[i][j]=max(dp[i-1][j],dp[i][j-w_i]+v_i) dp[i][j]=max(dp[i−1][j],dp[i][j−wi​]+vi​),表示当前物品不放入背包或者放入背包均可。

  • (二维的转移方程还是比较好记的,只需要将 d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − w i ] + v i ) dp[i][j]=max(dp[i-1][j],dp[\color{red}i-1\color{black}][j-w_i]+v_i) dp[i][j]=max(dp[i−1][j],dp[i−1][j−wi​]+vi​)写成i就行)

13 = 9 = 3 \sqrt {13} = \sqrt{9} = 3 13 ​=9 ​=3

012345678910111213
1
2
3

" 能够放入背包的最大价值 " ⇒ " 能够放入背包的最小价值 " ( 每个数的价值为 1 ) "能够放入背包的最大价值" \Rightarrow "能够放入背包的最小价值"\tiny(每个数的价值为1) "能够放入背包的最大价值"⇒"能够放入背包的最小价值"(每个数的价值为1)
d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − w i ] + v i ) dp[i][j]=max(dp[i-1][j],dp[i][j-w_i]+v_i) dp[i][j]=max(dp[i−1][j],dp[i][j−wi​]+vi​)

在这里插入图片描述
d p [ i ] [ j ] = m i n ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − w i ] + 1 ) dp[i][j]=min(dp[i-1][j],dp[i][j-w_i]+1) dp[i][j]=min(dp[i−1][j],dp[i][j−wi​]+1)

class Solution {
public:
    // 求平方后小于 n 的最大完全平方数
    int min_sq(int n) {
        int ans = 1;
        for ( int i=1;i<n;i++ ) {
            if ( i*i>n )
                break;
            ans = i;
        }
        return ans;
    }

    int numSquares(int n) {

        // // 记忆化搜索
        // int m = min_sq(n), cache[m+1][n+1];
        // memset(cache, -1, sizeof(cache));
        // function<int(int,int)> dfs = [&](int i, int c) -> int {
        //     if ( i<0 )
        //         return c==0 ? 0 : INT_MAX/2;
        //     if ( cache[i][c]!=-1 )
        //         return cache[i][c];
        //     if ( c<(i+1)*(i+1) )
        //         return cache[i][c] = dfs(i-1, c);
        //     return cache[i][c] = min(dfs(i-1, c), dfs(i, c-(i+1)*(i+1))+1);
        // };

        // return dfs(m-1, n);

        // // 1:1 递推
        // int m = min_sq(n), f[m+1][n+1];
        // memset(f, 0x3f, sizeof(f));
        // f[0][0] = 0;
        // for ( int i=0;i<m;++i ) {
        //     for ( int c=0;c<n+1;++c ) {
        //         if ( c<(i+1)*(i+1) )
        //             f[i+1][c] = f[i][c];
        //         else
        //             f[i+1][c] = min(f[i][c], f[i+1][c-(i+1)*(i+1)]+1);
        //     }
        // }
        // return f[m][n];

        // // 滚动双数组空间优化
        // int m = min_sq(n), f[2][n+1];
        // memset(f, 0x3f, sizeof(f));
        // f[0][0] = 0;
        // for ( int i=0;i<m;++i ) {
        //     for ( int c=0;c<n+1;++c ) {
        //         if ( c<(i+1)*(i+1) )
        //             f[(i+1)%2][c] = f[i%2][c];
        //         else
        //             f[(i+1)%2][c] = min(f[i%2][c], f[(i+1)%2][c-(i+1)*(i+1)]+1);
        //     }
        // }
        // return f[m%2][n];

        // 单数组空间优化
        int m = min_sq(n), f[n+1];
        memset(f, 0x3f, sizeof(f));
        f[0] = 0;
        for ( int i=0;i<m;++i ) {
            for ( int c=0;c<n+1;++c ) {
                if ( c>=(i+1)*(i+1) )
                    f[c] = min(f[c], f[c-(i+1)*(i+1)]+1);
            }
        }
        return f[n];
    }
};

// 作者:thirikid
// 链接:https://leetcode.cn/problems/perfect-squares/solution/ling-shen-wan-quan-bei-bao-hui-su-ji-yi-d48mb/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一维

这个问题可以通过动态规划求解。我们可以用一个一维数组 d p dp dp 来表示和为 i i i 的完全平方数的最少数量,状态转移方程为:

d p [ i ] = min ⁡ j = 1 i { d p [ i − j 2 ] + 1 } dp[i] = \min_{j=1}^{\sqrt{i}} \{dp[i-j^2] + 1\} dp[i]=j=1mini ​​{dp[i−j2]+1}

其中, j j j 表示一个完全平方数, i − j 2 i-j^2 i−j2 表示剩余的部分。也就是说,要计算和为 i i i 的完全平方数的最少数量,我们需要枚举最后一个完全平方数 j j j,并计算剩余部分 i − j 2 i-j^2 i−j2 的最少数量,最后加上 1 即可。

初始状态为 d p [ 0 ] = 0 dp[0] = 0 dp[0]=0,因为和为 0 0 0 的完全平方数数量为 0 0 0。

最终的答案为 d p [ n ] dp[n] dp[n]。以下是Python代码实现:

def numSquares(n: int) -> int:
    # 初始化状态
    dp = [float('inf')] * (n + 1)
    dp[0] = 0

    # 状态转移
    for i in range(1, n+1):
        for j in range(1, int(i ** 0.5) + 1):
            dp[i] = min(dp[i], dp[i - j*j] + 1)

    return dp[n]
Qt | 开发过程中总结的经验 关于如何判断自己的Qt库是多少位,有个误区就是很多人要么看成了QtCreator的关于信息中列出的位数,要么以为自己是64位的系统就认为是64位的Qt,最终要在Qt构建套件中查看具体位数,大概从Qt5.14开始基本上很少提供32位的库,尤其是Qt6.0以后基本上默认就是只有64位的库了,这也是顺应时代潮流,毕竟不久的将来(个人预计2030年以前)基本上32位的系统占比不超过1%,放心大胆的用64位的库吧,抛弃烦人的32位以及XP系统。Qt常用类的头文件的函数看完学完使用一遍并加以融会贯通,月薪30K起步。 阅读详情

相关推荐

到底什么是电源的斜波补偿,电源芯片CS引脚作用,一文讲清楚!

上文有提到电流环,其实电流环再细分也有很多模式,用的最多的是峰值电流模式峰值电流模式调节工作原理如下:(1)当输出负载增大时,输出电压降低,因此,Vc 增大,线性增加的电感电流只有升高到更大的值才能使 PWM 电流比较器翻转,开关管导通的时间增长,占空比增加,输入功率增加,因此输出电压增加,当输出电压增加到调节的范围内时,系统保持平衡。

jwgdhuwdhg的博客 1万+

LeetCode 279. 完全平方数

LeetCode 279. 完全平方数

梦~' 1033

CANOCO5.0实现冗余分析(RDA)最详细步骤

在地理及生态领域会常使用RDA分析,RDA的实现路径也有很多,今天介绍一下CANOCO软件的实现方法。1.不同样点和环境因子之间夹角是锐角 是正相关,是钝角是负相关。2.夹角越大 说明相关性较小,夹角越小,相关性越大。得有不同的物种或者样点数值,再加上环境因子数据。3.箭头越长 相关性越大。时间调整到2010年。

Along6的博客 1万+

LeetCode 279. 完全平方数(经典必会)

例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。毫无疑问,第一层循环必定循环n次,而第二层循环当在每次的第一层循环时都会循环n次,则时间复杂度为。,心算不好算,而且有时候笔算也不一定会推导,所以基于函数图像和夹逼定理思想会较为容易。对于上述动态规划解法,第一层循环为n,第二层循环次数为第一层循环次数i的。给你一个整数 n ,返回 和为 n 的完全平方数的最少数量。关系,求x=n时该图像与x轴和x=n围成的面积。,说白了就是外层循环作为x,二层循环作为y,有。

予早随笔 1379

专栏三:解析spatialCNV的使用

文章Spatially resolved clonal copy number alterations in benign and malignant tissue发在natur

m0_58549466的博客 1252

【Bluetooth蓝牙开发】一、开篇词 | 打造全网最详细的Bluetooth开发教程

1、开篇词 2、蓝牙开发入门 3、蓝牙协议栈总览 4、蓝牙协议栈——物理层 5、蓝牙协议栈——链路层 6、蓝牙协议栈——传输层 7、蓝牙协议栈——L2CAP协议 8、蓝牙协议栈——ATT协议 9、蓝牙协议栈——GATT协议 10、蓝牙通信流程分析 11、蓝牙协议栈——Bluez交叉编译 12、蓝牙调试工具汇总

Donge's Blog 1万+

Leetcode刷题(第279题)——完全平方数

一、题目 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。 二、示例 输入:n = 12 输出:3 解释:12 = 4 + 4 + 4 输入:n = 13 输出:2 解释:13 = 4 + 9 三、思路 本题的思路是使用动态规划,使用一个数组来保存信息,然后不断进行循环,这里我们以5为例: 最开始的为5个1*1,所以此时的结果为

weixin_47450807的博客 708

Plant Simulation与ABB机器人虚实结合

Plant Simulation与ABB机器人虚实结合

santayana的专栏 1869

LeetCode-第279题-完全平方数

LeetCode-第279题-完全平方数

人间失格的博客 571

OPTEE常见13类问题与解答

OPTEE常见13类问题并解答

AI-安全-功耗 1204

姿态传感器/陀螺仪之ICM-42670-P应用原理图设计

ICM-42670-P采用LGA-14封装,尺寸为2.5x3x0.76毫米,工作电压范围为1.71V至3.6V,支持I3CSM、I2C和SPI串行通信接口。其设计目标是提供高精度、低功耗和小型化的解决方案,以满足消费类和工业应用的需求。ICM-42670-P是一款由TDK InvenSense推出的高性能六轴MEMS运动追踪传感器,集成了3轴陀螺仪和3轴加速度计,适用于多种应用场景,包括可穿戴设备、游戏控制器、无人机、AR/VR设备等。

corlin6688的博客 1206

Java | Leetcode Java题解之第279题完全平方数

Java | Leetcode Java题解之第279题完全平方数

m0_57195758的博客 747

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

力扣完全背包问题(力扣279,322)

完全背包问题,是动态规划背包问题的一种,与传统的0-1背包不同,完全背包主要研究对于不同的物品放入给定容量的背包中,但是物品的数量是无限的,可以重复放入,一般研究最少或最多放入的物品数量。下面是两道经典的完全背包问题,因为是动态规划初学者,这里使用二维dp数组进行求解,形式相比一维dp较为复杂,但逻辑相对更加清楚。

weixin_48098743的博客 664

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【leetCode-DP-完全背包】279. 完全平方数

给定正整数n,找到若干个完全平方数(比如1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 示例1: 输入: n = 12 输出: 3 解释: 12 = 4 + 4 + 4. 示例 2: 输入: n = 13 输出: 2 解释: 13 = 4 + 9. 题目类似于换零钱(完全背包) 见:链接 code: class Soluti...

Grit_ICPC的博客 300

279. 完全平方数

找零钱问题:把看作不同面额的硬币,目标是凑出总额n,问最少需要几枚硬币?模型:完全背包(Unbounded Knapsack)。区别:0/1 背包选了就得跳到i-1,而这里选了当前平方数,还可以继续留在i再选一次(例如Static 技巧:题目会多次调用numSquares,利用static缓存,计算过的结果(比如)在下一个测试用例里可以直接用。“一次算好,终身受用:把所有 1 到 10000 的答案提前算好填在表格里。填表时,每个完全平方数都可以被‘无限次’使用,这正是完全背包的特征。

一同进步 724

LeetCode 279. 完全平方数 (动态规划dp || 完全背包)

【代码】LeetCode 279. 完全平方数 (动态规划dp || 完全背包)

记录一些刷过的题并分享学习心得 375

LeetCode 279:完全平方数(完全背包)—— 题解

动态规划——完全平方数

2601_95366422的博客 475

【leetCode-DFS】【leetCode-DP-01背包】279. 完全平方数

给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号+和-。对于数组中的任意一个整数,你都可以从+或-中选择一个符号添加在前面。 返回可以使最终数组和为目标数 S 的所有添加符号的方法数。 示例 1: 输入: nums: [1, 1, 1, 1, 1], S: 3 输出: 5 解释: -1+1+1+1+1 = 3 +1-1+...

Grit_ICPC的博客 464

leetcode279.完全平方数

是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。几乎一毛一样,只不过这里物品重量要自己计算。的完全平方数的最少数量。

m0_64995001的博客 565

代码随想录 279.完全平方数

2.确定递推公式:dp[j]可以由dp[j - i * i]推出,dp[j - i * i] + 1便可凑成dp[j],要选择最小的dp[j],所以递推公式为:dp[j] = min(dp[j],dp[j - i * i] + 1)。(2)非0下标的dp[j]:从递推公式dp[j] = min(dp[j],dp[j - i * i] + 1)中可以看出每次dp[j]都要选最小的。1.确定dp数组(dp table)及其下标的含义:dp[j]表示和为j的完全平方数的最少数量为dp[j]。

m0_63814538的博客 294

leetcode 279 完全平方数 背包问题 逆初始化

此题一看就属于没法做那种,和丑数还是不太一样的。丑数要用质因数,此题就是可以转化为背包来做。 考虑dp[i]是i的最少数量,dp[i]可以由dp[i-j*j]得到。也和最长上升子序列有些类似。 class Solution { public: int numSquares(int n) { vector<int> dp(n+1, 1e5); dp[0] = 0; for(int i=1;i<=n;i++) { .

qq_39678022的博客 184

力扣 | 背包dp | 279. 完全平方数、518. 零钱兑换 II、474. 一和零、377. 组合总和 Ⅳ

这个目标就是我们定义的状态、这个物品就是我们要规定什么时候能包含的、这个背包就是总的容量比如这个完全平方数,我们要定义的状态是和为。

m0_63997099的博客 1151

Leetcode 279. 完全平方数

1、边界条件中需要去除x<0的时候的情况,可以用正无穷配合返回值的min去除。2、注意候选动作应该从1开始,而不是0。返回值:和为当前整数的最少完全平方数。动作:选哪一个满足要求的完全平方数。状态:当前要处理的整数。

普通攻击往后拉的博客 573

力扣279-完全平方数(Java详细题解)

因为选择了i * i作为物品,所以我们要知道选择i * i之前的背包容量所能装的最少物品数量,然后选择了这个物品,那我们的物品数量就会加1。唯一不同的就是物品不一样,零钱兑换是把物品数量什么的都给出来了,该题的物品没给出来,需要我们自己创建。因为我初始化为最大的数值,其他的数肯定小于等于它,当我递推出一个比它小的值时,就能覆盖这个最大值,不影响我递推的值。本题是求最小值,如果我将非0下标也初始化为0,那么我初始化的0就会将我递推出来的最小值覆盖,最后得出来为0。所以我物品的排列组合是不影响我dp数组的。

2302_79761426的博客 1273

关于动态规划【力扣279.完全平方数与322.零钱兑换的共同点】

2、只要是物品可以无限次取,需要求装满这个背包所需的最少个数问题。等同于完全背包的求组合数问题(或者求排列数问题,因为不管求组合数还是求排列数都不会影响最少个数的计算)【力扣279.完全平方数】题目隐含意思:平方数可以无限取(因为示例1的2的平方数4就取了三次)1、最明显的一个共同点就是:都是完全背包的应用,场景都是求装满这个背包所需的。3、求组合数还是求排列数的代码体现在两层for循环的遍历顺序。非零数组元素初始化为INT_MAX。4、(自己要注意数组初始化问题。先遍历背包,就是在求排列数)

wasb666的博客 198

力扣-动态规划-279. 完全平方数

力扣-动态规划-279. 完全平方数

qianxunsiyue的博客 592

【Hot100】LeetCode—279. 完全平方数

279. 完全平方数。

weixin_44382896的博客 658
上一篇: TensorRT triton003 launch Triton SERVER (乱记)
下一篇: LeetCode494. 目标和 0-1背包DP
FakeOccupational
博客等级 码龄6年 2万+粉丝 1727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值