• LeetCode279. 完全平方数


    题目

    分析

    本题的完全平方数可以重复取,为完全背包问题。dp[i] 表示 凑成 j 的完全平方数的最少个数。递推公式就是从背包问题推出来的

    dp[j] = min(dp[j],dp[j-nums[i]] + 1)

    初始化,因为求最小值,为了让初始值覆盖结果,所以将初始值设为正无穷。dp[0] = 0,因为0时,完全平方数量为0。当然如果不设dp[0] = 0,直接编译会在第12行报错,超长(INT_MAX+1)且完全背包问题,正序遍历背包。

    代码

     1 class Solution {
     2 public:
     3     int numSquares(int n) {
     4         vector<int>nums; //存放完全平方数
     5         for(int i = 1;i * i <= n;i++){
     6             nums.push_back(i*i);
     7         }
     8         vector<int>dp(n+1,INT_MAX);
     9         dp[0] = 0;
    10         for(int i = 1;i < nums.size();i++){
    11             for(int j = nums[i];j <= n;j++){
    12                 dp[j] = min(dp[j],dp[j-nums[i]] + 1); 
    13             }
    14         }
    15         return dp[n];
    16     }
    17 };

    优化后

     1 class Solution {
     2 public:
     3     int numSquares(int n) {
     4         vector<int>dp(n+1,INT_MAX);
     5         dp[0] = 0;
     6         //先遍历物品再遍历背包,可以交换遍历顺序
     7         for(int i = 1;i * i <= n;i++){
     8             for(int j = i*i;j <= n;j++){
     9                 dp[j] = min(dp[j],dp[j-i*i] + 1); 
    10             }
    11         }
    12         return dp[n];
    13     }
    14 };
  • 相关阅读:
    Python开发WebService--使用soaplib库
    weblogic
    cronttab命令
    redhat下配置VNC远程客户端连接
    Linux主机名域名修改问题
    使用expdp命令自动备份数据库
    Linux下内存管理
    Linux下用户和用户组管理
    虚拟机上安装vmware tool
    linux基本信息查询
  • 原文地址:https://www.cnblogs.com/fresh-coder/p/14413316.html
Copyright © 2020-2023  润新知