本题可转化为完全背包问题,背包的容量为 n, 但 物品 并未直接给出, 而是通过遍历 i, 物品大小和价值,便是 i * i。
- dp[j] 表示 和为整数 j 的完全平方数的最小数量
- 递推公式 dp[j] = min(dp[j], dp[j - num] + 1)
- 初始化 由于要比较出较小值,因此不能将数组默认初始化为0,以防影响结果,而是默认初始化为INT_MAX, dp[0] = 0
- 遍历顺序,本题只需统计次数,完全背包问题 外层内层 遍历 均为从前往后遍历,背包容量 和 物品种类 两者谁在 外层遍历不重要
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n + 1, INT_MAX);
dp[0] = 0;
for(int i = 1; i <= n; i++){
int num = i * i;
for(int j = num; j <= n; j++){
dp[j] = min(dp[j], dp[j - num] + 1);
}
}
return dp[n];
}
};