📅  最后修改于: 2023-12-03 15:25:40.346000             🧑  作者: Mango
给定一个正整数N,找到一组平方数,使得它们的总和正好等于N,并且这些平方数的个数最少。如果存在多组解,输出任意一个即可。
问题可以使用动态规划求解,首先定义一个数组dp,其中dp[i]表示当总和为i时的最小平方数套装。初始化dp数组的值为无穷大,因为我们需要找最小的平方数套装。接下来,我们逐步枚举i的值,对于每个i,我们从1开始枚举每个j,其中j表示平方数,如果j的平方大于i,则需要退出内层循环。否则,我们比较dp[i-j*j]和dp[i]+1的大小,取其中最小值作为当前dp[i]的值。具体实现参见代码部分。
class Solution:
def numSquares(self, n: int) -> int:
dp = [float('inf')] * (n+1)
dp[0] = 0
for i in range(1, n+1):
j = 1
while j*j <= i:
dp[i] = min(dp[i], dp[i-j*j]+1)
j += 1
return dp[n]