法1:dp
跟兑换零钱相同思路,对比记忆!!!
跟完全背包问题的解法一致!
Python
class Solution:
def numSquares(self, n: int) -> int:
dp = [n] * (n+1) # dp[i]表示和为i的完全平方数的最少数量
dp[0] = 0
for i in range(1, n+1):
k = 1
while k * k <= i:
dp[i] = min(dp[i-k*k] + 1, dp[i])
k += 1
return dp[n]
Java
class Solution {
public int numSquares(int n) {
int[] dp = new int[n + 1];
for (int i = 1; i <= n; ++i) {
int min = n;
for (int k = 1; k * k <= i; ++k) {
min = Math.min(min, 1 + dp[i - k * k]);
}
dp[i] = min;
}
return dp[n];
}
}