Leetcode-279-完全平方数(类完全背包)

题目链接


题目描述

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

返回和为n的完全平方数的 最少数量


思路

零钱兑换 一模一样
都是可以用完全背包的思想解决,

  1. 每个平方数值看作是 物品体积v[i],每个物品的价值都是 1。
  2. dp[j] 表示背包是 j 体积状态下最少个数,dp[0] = 0;
  3. dp[j] 初始为无穷大,表示无法满足。
  4. dp[j] = min(dp[j], dp[j-v[i]]+1);

C++代码


class Solution {
public:
    int numSquares(int n) {

        vector<int> v;
        vector<int> dp(n+1, 10001);

        for (int i = 1; i*i <= n; i++)
            v.emplace_back(i*i);

        int len = v.size();
        dp[0] = 0;
        for (int i = 0; i < len; i++)
            for (int j = v[i]; j <= n; j++)
                dp[j] = min(dp[j], dp[j-v[i]]+1);
        return dp[n];
    }
};
上一篇:279.完全平方数


下一篇:2022-2023学年英语周报七年级第17期答案及试题