给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

    示例 1:

    输入: n = 12
    输出: 3
    解释: 12 = 4 + 4 + 4.
    示例 2:

    输入: n = 13
    输出: 2
    解释: 13 = 4 + 9.

    思考:
    // 分析:定义dp[i]表示数字i由完全平方数组成的最少个数;
    // 1、如果i恰好为一个完全平方数,则dp[i] = 1;
    // 2、如果i不能恰好表示为一个完全平方数,dp[i] = dp[i-sqrt(i)sqrt(i)] + 1;
    // 所以状态转移为: dp[i] = min(dp[i], dp[i - sqrt(i)
    sqrt(i)] + 1);

    1. int numSquares(int n) {
    2. int sqrt_n = (int)sqrt(n);
    3. vector<int> dp(n+1);
    4. // initialize status
    5. // 状态初始化:dp[i] = i表示最差情况:每一个数都是最大个数的完全平方数1组成;
    6. for(int i = 0; i <= n; ++i)
    7. dp[i] = i;
    8. // 从小到大的遍历,获取每一个i的最小完全数和个数
    9. for(int i = 1; i <= n; ++i)
    10. {
    11. // 状态转移计算dp[i]的最小完全数和的个数
    12. for(int j = 1; j*j <= i; ++j)
    13. dp[i] = min(dp[i], dp[i-j*j] + 1);
    14. }
    15. return dp[n];
    16. }

    欢迎交流,批评指正!

    最少完全平方数个数[动态规划] - 图1最少完全平方数个数[动态规划] - 图2