题目:完全平方数

定义了一个数组,用来存储n之前每一个元素的完全平方数的最少数量,这样就得到了状态转移方程:

$ dp[i] = 1 + \min_{1 \le j^2 \le i} \{ dp[i - j^2] \} $

其中,i 是从1到 n 的所有数字,j^2是小于等于 i 的所有完全平方数

每次当 n 减去 i 之后,都会以 i 为右边界进行一次遍历,此时就是对每一个 i 进行”局部穷举“,看看此时有哪些组成 j^2 的最少数字数量,我们会选取最小的作为当前的结果

 1int numSquares(int n)
 2{
 3    std::vector<int> f(n + 1);
 4    for(int i = 1; i <= n; i++)
 5    {
 6        int minn = INT_MAX;
 7        for(int j = 1; j * j <= i; j++)
 8            minn = std::min(minn, f[i - j * j]);
 9
10        f[i] = minn + 1;
11    }
12    return f[n];
13}