leetcode 279. Perfect Squares

本题也是完全背包问题。并且本质上与第322题一模一样。要求的是装满背包最少需要多少个物品。与第322题一样,dp数组的初始化需要仔细考虑。详见leetcode 322. Coin Change

本题,给定整数n就相当于给定容量大小为n的背包。n只可能等于,1,4,9,...,这些完全平方数的和。相当于物品个数就是,物品重量是1,4,9,...,

第一版代码

外层循环遍历物品,内层循环遍历背包容量。

cpp 复制代码
class Solution {
public:
    int numSquares(int n) {
        int m = sqrt(n);
        //dp[j]表示和为j的完全平方数的最少数量
        vector<int> dp(n+1,n+1);
        //从题意可以看出,虽然0等于0的平方,但是本题完全平方数不包含0
        //dp[0]初始化为0表示,无法找到和为0的完全平方数
        dp[0] = 0;
        for(int i = 1;i <=m;i++){//外层循环对物品遍历
            for(int j = i*i;j <=n;j++){//内层循环对背包容量遍历
                dp[j] = min(dp[j],dp[j-i*i]+1);
            }
        }
        return dp[n];
    }
};

第二版代码

外层循环遍历背包容量,内层循环遍历物品。

cpp 复制代码
class Solution {
public:
    int numSquares(int n) {
        int m = sqrt(n);
        //dp[j]表示和为j的完全平方数的最少数量
        vector<int> dp(n+1,n+1);
        //从题意可以看出,虽然0等于0的平方,但是本题完全平方数不包含0
        //dp[0]初始化为0表示,无法找到和为0的完全平方数
        dp[0] = 0;
        // for(int i = 1;i <=m;i++){//外层循环对物品遍历
        //     for(int j = i*i;j <=n;j++){//内层循环对背包容量遍历
        //         dp[j] = min(dp[j],dp[j-i*i]+1);
        //     }
        // }
        for(int j = 0;j<=n;j++){//外层循环对背包容量遍历
            for(int i = 1;i<=m;i++){//内层循环对物品遍历
                if(j>=i*i)
                    dp[j] = min(dp[j],dp[j-i*i]+1);
            }
        }
        return dp[n];
    }
};
相关推荐
晚风醉蝶2 小时前
第零篇-算法全景图
算法
疯狂打码的少年2 小时前
【数据结构】树的基本概念与二叉树定义
java·数据结构·笔记·算法
webmote332 小时前
用 NVIDIA Nemotron 3 Super + .NET 构建有记忆的多轮对话
后端·算法
Keven_113 小时前
算法札记:区分稀疏图与稠密图在经验上的数学计算差异
算法·稠密图·稀疏图
Sagittarius_A*3 小时前
后量子密码|前置基础 03|数字签名运行逻辑:签名签发、核验原理与实际业务应用
算法·信息安全·密码学·数字签名·后量子密码
DBA小马哥3 小时前
向量数据库入门到进阶:Embedding、ANN算法与RAG落地的关键术语
数据库·算法·embedding
Luhui Dev4 小时前
如何在 WorkBuddy 中使用大角几何:从 MCP 接入到 AI 几何作图
人工智能·数学·算法·agent·luhuidev
Smilecoc4 小时前
决策树(五):决策树回归
算法·决策树·回归
小龙报4 小时前
【优选算法】1.搜索插入位置 2.x的平方根
java·c语言·数据结构·c++·python·算法·蓝桥杯
Hi李耶5 小时前
【LeetCode】15.三数之和
java·算法·leetcode