题目描述:
标签:广度优先搜索 数学 动态规划
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
代码:
思路分析:动态规划五部曲(完全背包问题)
1、确定dp数组以及下标的含义——这里dp[i]是指背包重量是i,凑成该重量的最少完全平方数的个数
2、确定递推公式,典型背包公式递推,dp[i] = min(dp[i-j*j]+1,dp[i])
3、dp数组初始化,dp[0]=0,记得dp初始化需要填充Integer.MAX_VALUE,使用Arrays.fill(a,1)
4、确定遍历顺序,双层for循环遍历,i从0到n(遍历所有重量),j从物品1到j*j<=i
5、举例推导dp数组
6、最后返回dp[n]
class Solution {
public int numSquares(int n) {
int[] dp = new int[n+1];
Arrays.fill(dp,Integer.MAX_VALUE);
dp[0] = 0;
for(int i = 0;i <= n;i++){
for(int j = 1;j*j <= i;j++){
dp[i] = Math.min(dp[i],dp[i-j*j]+1);
}
}
return dp[n];
}
}