LeetCode 279 完全平方数

LeetCode 279 完全平方数

🟡 中等

https://leetcode.cn/problems/perfect-squares/description/

注意到 1 <= n <= 10^4,这就类似于换银币[11-518零钱兑换](LeetCode 518 零钱兑换 II.md) ,只不过这里的硬币是一系列的平方数。

class Solution {

public:

    int sel_not(int i, int cap) {

        if (i == 0) {

            if (cap == 0)

                return 0;

            return INT_MAX;

        }

        int ii = i * i;

        int not_sel = sel_not(i - 1, cap);

        if (cap >= ii) {

            int sel = sel_not(i, cap - ii);

            int left = sel == INT_MAX ? INT_MAX : 1 + sel;

            return min(left, not_sel);

        } else {

            return not_sel;

        }

    }

    int numSquares(int n) {

        int dp[n + 1];

        fill(dp, dp + n + 1, INT_MAX);

        dp[0] = 0;

        for (int i = 1; i <= 100; i++) {

            for (int j = i * i; j <= n; j++) {

                int sel = dp[j - i*i];

                int left = sel == INT_MAX ? INT_MAX : 1 + sel;

                dp[j] = min(left, dp[j]);

            }

        }

        // return sel_not(100, n);

        return dp[n];

    }

};