leetcode

279.完全平方数

力扣链接

动规五部曲
  1. 确定用作状态转移的dp数组的下标及含义 dp[j] 整数n为j时 和为j的完全平方数的最少数量

  2. 动规核心 状态转移方程/递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序 从小到大遍历
  5. 打印dp数组用于排错
class Solution {
public:
    int numSquares(int n) {
        // 设置成INT_MAX-1 防止dp[j-i*i]+1 整数越界
        std::vector<int> dp(n + 1, INT_MAX - 1);// 背包大小
        // dp[j-i*i] + 1 = dp[0] + 1 = 1 当 j = i*i
        dp[0]=0; // 多增加 dp[0]=0 为了递推公式
        for (int i=0;i*i<n+1;i++) // 遍历物品
            // 此处j不能从1开始,避免dp[j-i*i]下标负数
            for (int j=i*i;j<n+1;j++) //遍历背包
                dp[j] = std::min(dp[j-i*i]+1, dp[j]);
        return dp[n];
    }
};