day 45:爬楼梯进阶版;322. 零钱兑换;279. 完全平方数

这篇具有很好参考价值的文章主要介绍了day 45:爬楼梯进阶版;322. 零钱兑换;279. 完全平方数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

爬楼梯进阶版

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 一步一个台阶,两个台阶,三个台阶,…,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢?

1. dp数组以及下标名义

dp[j]:爬到j层一共有多少种方法。

2. 递归公式

递推公式:dp[j] += dp[j - i];

3. dp数组如何初始化

dp[0] = 1;

4. 遍历顺序:颠倒两个for循环顺序,先遍历背包再遍历物品

5. 代码

class Solution {
public:
    int climbStairs(int n) {
        vector<int> dp(n + 1, 0);
        dp[0] = 1;
        for (int i = 1; i <= n; i++) { // 遍历背包
            for (int j = 1; j <= m; j++) { // 遍历物品
                if (i - j >= 0) dp[i] += dp[i - j];
            }
        }
        return dp[n];
    }
};

322. 零钱兑换:硬币可以重复选取

day 45:爬楼梯进阶版;322. 零钱兑换;279. 完全平方数

1. dp数组以及下标名义

dp[i]:目标整数为i的背包所能凑的最少硬币个数。

2. 递归公式

coin[0] = 1时,dp[1]=1.dp[2] = 2;…dp[11]=11;
coin[1] = 2时,dp[1]=1;dp[2]=1;dp[3]=2;dp[4]=2;dp[5]=3;dp[6]=3;dp[7]=4;dp[8]=4
coin[2] = 5时,dp[1]=1;dp[2]=1;dp[3]=2;dp[4]=2;dp[5]=1;dp[6] =2
dp[i] = min(dp[i], dp[i - coins[j]] + 1);

3. dp数组如何初始化

dp[0] = 0;目标和为0 所以是0个硬币

4. 遍历顺序:组合与排列都可以,因为不影响本题求解

5. 代码

class Solution {
public://完全背包问题
    int coinChange(vector<int>& coins, int amount) {
      vector<int>dp(amount + 1, INT_MAX); 
      dp[0] = 0;
        for(int j = 0; j < coins.size(); j++) {//遍历物品
              for(int i = coins[j]; i <= amount; i++) {//遍历背包
              if(dp[i - coins[j]] != INT_MAX) {// 如果dp[j - coins[i]]是初始值则跳过
                   dp[i] = min(dp[i], dp[i - coins[j]] + 1);
              }
          }
      }
      if(dp[amount] == INT_MAX) return -1;
      return dp[amount];
    }
};


和之前一样的写法,用 if(i - coins[j] >= 0) ,但是vector里面要用double,因为初始化为整型的最大值了
class Solution {
public://完全背包问题
    int coinChange(vector<int>& coins, int amount) {
      vector<double>dp(amount + 1, INT_MAX); 
      dp[0] = 0;
        for(int j = 0; j < coins.size(); j++) {//遍历物品
             cout<<"coin "<< j<<" :";
              for(int i = coins[j]; i <= amount ; i++) {//遍历背包
              //if(dp[i - coins[j]] != INT_MAX) {// 如果dp[j - coins[i]]是初始值则跳过
                   if(i - coins[j] >= 0) {
                   dp[i] = min(dp[i], dp[i - coins[j]] + 1);
                 //  cout<<i<<":"<<dp[i]<<" ";
              }
              //cout<<endl;
          }

      }
      if(dp[amount] == INT_MAX) return -1;
      return dp[amount];
    }
};


279. 完全平方数

1. dp数组以及下标名义

dp[j]:目标为j的完全平方数最少的数量。

2. 递归公式

1时,dp[1]=1.dp[2] = 2;…;
2时,dp[1]=1;dp[2]=2;dp[3]=3;dp[4]=1;dp[5]=2;dp[6]=3;dp[7]=4;dp[8]=2
3时,dp[1]=1;dp[2]=1;dp[3]=2;dp[4]=2;dp[5]=2;dp[6]=3;dp[7]=4;dp[8]=2;dp[9]=1;dp[10]=2
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
递推公式:dp[j] = min(dp[j],dp[j - i *i] +1);

3. dp数组如何初始化

dp[0] = 0;文章来源地址https://www.toymoban.com/news/detail-470316.html

4. 遍历顺序:组合与排列都可以,因为不影响本题求解

5. 代码

class Solution {
public:
    int numSquares(int n) {
        vector<double>dp(n + 1, INT_MAX);
        dp[0] = 0;
        for(int i = 0; i <= sqrt(n); i++) {
            for(int j = i * i; j <= n; j++) {
                if(j - i * i >= 0)
                dp[j] = min(dp[j], dp[j - i * i] + 1);
            }
        }
        return dp[n];

    }
};

到了这里,关于day 45:爬楼梯进阶版;322. 零钱兑换;279. 完全平方数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法打卡day39|动态规划篇07| Leetcode 70. 爬楼梯(进阶版)、322. 零钱兑换、279.完全平方数

    Leetcode 70. 爬楼梯(进阶版) 题目: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 = m n)个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 输入描述:输入共一行,包含两个正整数,分别表示n, m 输出描述:输出一个整数,

    2024年04月14日
    浏览(47)
  • 第42天-DP-第九章● 70. 爬楼梯 (进阶) ● 322. 零钱兑换 ● 279.完全平方数

    - LeetCode链接 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? - LeetCode链接 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬

    2024年02月01日
    浏览(36)
  • 算法训练第四十五天|70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

    题目链接:70. 爬楼梯 (进阶) 参考:https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85%E7%89%88%E6%9C%AC.html 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数

    2023年04月26日
    浏览(50)
  • 【Day45】代码随想录之动态规划part7—爬楼梯(进阶)、零钱兑换、完全平方数

    今天又是补打卡的一天,开冲!!! 今日任务: 70.爬楼梯(进阶) 322.零钱兑换 279.完全平方数 这道题之前做过一次,但是可以采用完全背包的问题来分析一遍。 卡玛网题目:【57.爬楼梯】 这个题目其实是更难了一点,因为前面的题目都是每次要不爬1阶楼梯,要不爬2阶楼

    2024年03月25日
    浏览(41)
  • leetcode 动态规划(爬楼梯、零钱兑换、完全平方数)

    卡码网:57. 爬楼梯(opens new window) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 = m n)个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 输入描述:输入共一行,包含两个正整数,分别表示n, m 输出描述:输出一个整数,表

    2024年01月17日
    浏览(33)
  • 【十九】【动态规划】518. 零钱兑换 II、279. 完全平方数、474. 一和零,三道题目深度解析

    动态规划就像是解决问题的一种策略,它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题,并将每个小问题的解保存起来。这样,当我们需要解决原始问题的时候,我们就可以直接利用已经计算好的小问题的解,而不需要重

    2024年02月03日
    浏览(27)
  • Day 44 | 动态规划 完全背包、518. 零钱兑换 II 、 377. 组合总和 Ⅳ

    题目 文章讲解 视频讲解 完全背包和0-1背包的区别在于:物品是否可以重复使用 思路:对于完全背包问题,内层循环的遍历方式应该是从weight[i]开始一直遍历到V,而不是从V到weight[i]。这样可以确保每种物品可以被选择多次放入背包,从而求解完全背包问题。 对于完全背包问

    2024年02月20日
    浏览(31)
  • leetcode 322. 零钱兑换

             本题属于完全背包问题,但要求最少的硬币个数。于是设定dp数组的含义dp[i]:总金额为i时,能凑成i的最少硬币个数。  需要注意初始化dp数组时,除0以外的其他地方需要初始化为INT_MAX以保证在递推过程中能被正确的覆盖。           代码如下:         ps:本题

    2024年02月12日
    浏览(23)
  • 【动态规划】322. 零钱兑换

    定义 要凑出金额n 至少要dp(coins,n)个硬币 确定base case 目标金额为0 返回0 确定 状态 也就是原问题和子问题中的变量,你每次抽取一个硬币,都会导致目标金额减少,所以状态就是目标金额 确定选择,也就是导致状态产生变化的行为,每次选一个硬币都会导致目标金额的减少

    2024年02月10日
    浏览(27)
  • 力扣 | 322. 零钱兑换

    这里使用动态规划,代码简洁更易理解

    2024年01月21日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包