9.15完全平方数

2024-03-12 22:36
文章标签 完全 平方 9.15

本文主要是介绍9.15完全平方数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

j

算法:

完全平方数就是物品(可以无限件使用),凑个正整数n就是背包,问凑满这个背包最少有多少物品?

动规五部曲:

1.确定dp及其下标

dp[j]:凑成j的最少完全平方数的个数为dp[j]

2.确定递推公式

dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]。

此时我们要选择最小的dp[j],

所以递推公式:dp[j] = min(dp[j - i * i] + 1, dp[j]);

3.dp初始化

dp[0]表示 和为0的完全平方数的最小数量,那么dp[0]一定是0

从递归公式dp[j] = min(dp[j - i * i] + 1, dp[j]);中可以看出每次dp[j]都要选最小的,所以非0下标的dp[j]一定要初始为最大值,这样dp[j]在递推的时候才不会被初始值覆盖

4.确定遍历顺序

本题外层for遍历背包,内层for遍历物品,还是外层for遍历物品,内层for遍历背包,都是可以的!

5.举例推导dp数组

以输入n为5例:

正确代码:

class Solution {public int numSquares(int n) {int[] dp = new int[n+1];for(int i=0;i<=n;i++){dp[i] = Integer.MAX_VALUE;}dp[0] = 0;for(int i=1; i*i<=n; i++){for (int j=0; j<=n;j++){if(j >= i*i){dp[j] = Math.min(dp[j-i*i]+1,dp[j]);}}}return dp[n];}
}

注意:

1.for循环中,i的初始值为1,因为题目中说了n最小值为1

2.

 for (int j=0; j<=n;j++){

                if(j >= i*i){

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

                }

可以等价替换为

            for (int j=i*i; j<=n;j++){              

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

            }

这样耗时更短!

最终的耗时短的正确代码:

class Solution {public int numSquares(int n) {int[] dp = new int[n+1];for(int i=0;i<=n;i++){dp[i] = Integer.MAX_VALUE;}dp[0] = 0;for(int i=1; i*i<=n; i++){for (int j=i*i; j<=n;j++){              dp[j] = Math.min(dp[j-i*i]+1,dp[j]);                               }}return dp[n];}
}

时间空间复杂度:

  • 时间复杂度: O(n * √n)
  • 空间复杂度: O(n)

这篇关于9.15完全平方数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

完全背包问题                  和01背包最大区别就是一个物品可以重复放多次,因此遍历空间时可以从前往后。 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt

uva674(完全背包)

题意: 有5种硬币1,5,10,25,50,;现在随意的给出一个价钱,问你有几种组合方式! 输入11 输出4 1+...+1(10个),5+(6*1),5+5+1,  10+1(共4种) 思路; 满足完全背包思想,状态转移方程:dp[i+num[k]] += dp[i](dp[i]为组合成i的不重复种数,num[k]分别为1,5,10,25,50)不能合在一起转移,否则会导致重复!

222.完全二叉树的节点个数

(写给未来遗忘的自己) 题目: 代码: class Solution {public:int countNodes(TreeNode* root) {queue<TreeNode*>node_que;if(root==nullptr) return 0;node_que.push(root);int result;while(!node_que.empty()){int layer_s

不完全微分PID控制算法

不完全微分PID控制算法 注:本文内容摘自《先进PID控制MATLAB仿真(第4版)》刘金琨 编著,研读此书受益匪浅,感谢作者! 在PID控制中,微分信号的引入可改善系统的动态特性,但也容易引起高频干扰,在误差扰动突变时尤其显出微分项的不足。若在控制算法中加入低通滤波器,则可以使系统性能得到改善。 克服上述缺点的方法之一是在PID算法中加入一个一阶惯性环节(低通滤波器) G f

JVM源码分析之SystemGC完全解读

概述 JVM的GC一般情况下是JVM本身根据一定的条件触发的,不过我们还是可以做一些人为的触发,比如通过jvmti做强制GC,通过System.gc触发,还可以通过jmap来触发等,针对每个场景其实我们都可以写篇文章来做一个介绍,本文重点介绍下System.gc的原理 或许大家已经知道如下相关的知识 system.gc其实是做一次full gcsystem.gc会暂停整个进程syste

最强MoE完全开源模型发布啦~

这篇文章介绍了OLMOE(Open Mixture-of-Experts Language Models)系列模型,这是一款开源的稀疏混合专家模型。OLMOE-1B-7B拥有70亿参数,但每个输入令牌仅使用10亿参数。该模型在5万亿令牌上进行预训练,并进一步适应以创建OLMOE-1B-7B-INSTRUCT。这些模型在相似活跃参数的模型中表现最佳,甚至超越了更大的模型,如Llama2-13B-

代码随想录:977. 有序数组的平方

977. 有序数组的平方 法一:用函数sort来写 class Solution {public:vector<int> sortedSquares(vector<int>& nums) {for(auto &i:nums)i*=i;sort(nums.begin(),nums.end());return nums;}}; 法二:双指针 因为原数组有序,所以我们用双指针遍历两边,把大的