leetcode动态规划(十九)-完全平方数
题目
279.完全平方数
给你一个整数 n
,返回 和为 n
的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1
、4
、9
和 16
都是完全平方数,而 3
和 11
不是。
示例 1:
输入:n =12
输出:3 解释:12 = 4 + 4 + 4
示例 2:
输入:n =13
输出:2 解释:13 = 4 + 9
提示:
1 <= n <= 104
思路
一看题目,就思考如何将n进行拆解,如何表达为不同数的平方和,这样就陷入了思维误区里难以走出来了
这个题目换一个角度来描述:
完全平方数就是物品(可以无限件使用),凑个正整数n就是背包,问凑满这个背包最少有多少物品?
这就是妥妥的零钱兑换的题目了
动规五步曲
1.确定dp含义
dp[j]表示装满容量为j的背包所需要的物品最少数量是dp[j]
2.确定递推公式
由零钱兑换转换可以得到dp[j] = min(dp[j],dp[j-i*i]+1)
3.初始化
由于是去最小值,所以在创建dp数组的时候就创建为最大值
dp[0] = 0
4.遍历顺序
在这里熟悉先物品后背包的方式,还是采用这种方式
但在遍历物品的时候,物品的数量是未知的,所以物品能够到的最大值是(n**0.5)+1
5.打印dp数组
代码
class Solution:
def numSquares(self, n: int) -> int:
dp = [float('inf')]*(n+1)
dp[0] = 0
for i in range(1,int(n**0.5)+1):
for j in range(i*i,n+1):
if i*i<=j:
dp[j] = min(dp[j],dp[j-i*i]+1)
return dp[n]