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];
    }
};
相关推荐
HEX9CF18 分钟前
【Linux】awk 命令详解及使用示例:结构化文本数据处理工具
linux·chrome·算法
Cl_rown去掉l变成C32 分钟前
第J3-1周:DenseNet算法 实现乳腺癌识别
人工智能·pytorch·算法
努力学习的小廉32 分钟前
我爱学算法之—— 前缀和(中)
开发语言·redis·算法
保持学习ing33 分钟前
黑马Java面试笔记之 集合篇(算法复杂度+ArrayList+LinkedList)
java·笔记·算法·面试
LunaGeeking38 分钟前
三分算法与DeepSeek辅助证明是单峰函数
c语言·c++·算法·编程·信奥赛·ai辅助学习·三分
Darkwanderor1 小时前
数论——同余问题全家桶3 __int128和同余方程组
c++·算法·数论·中国剩余定理
Xyz_Overlord1 小时前
机器学习——聚类算法
算法·机器学习·聚类
dessler1 小时前
代理服务器-LVS的3种模式与调度算法
运维·服务器·网络·算法·nginx·tomcat·lvs
拼好饭和她皆失1 小时前
动态规划 熟悉30题 ---上
算法·动态规划
fen_fen2 小时前
学习笔记(26):线性代数-张量的降维求和,简单示例
笔记·学习·算法