代碼隨想錄算法訓練營|第四十六天|完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ。刷题心得(c++)

这篇具有很好参考价值的文章主要介绍了代碼隨想錄算法訓練營|第四十六天|完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ。刷题心得(c++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

动态规划 - 完全背包

和01背包的差別

定義

核心代碼

遍歷順序

總結

讀題

518. 零钱兑换 II

自己看到题目的第一想法

看完代码随想录之后的想法

377. 组合总和 Ⅳ

自己看到题目的第一想法

518. 零钱兑换 II - 實作

思路

Code

377. 组合总和 Ⅳ - 實作

思路

Code

總結

自己实现过程中遇到哪些困难

今日收获,记录一下自己的学习时长

相關資料


动态规划 - 完全背包

和01背包的差別

定義

<aside> 💡 01背包 → 每件物品只有一件,可以選擇取或不取 完全背包 → 每件物品有無數件,可以選擇取或不取,可以重複取多次

</aside>

核心代碼

  • 01 背包

    背包從大到小 → 保證每個物品僅被添加一次

    for(int i = 0; i < weight.size(); i++) { 
        for(int j = bagWeight; j >= weight[i]; j--) { 
            dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
        }
    }
    
  • 完全背包

    因為完全背包物品可以添加多次,所以要從小到大

    for(int i = 0; i < weight.size(); i++) { 
        for(int j = weight[i]; j <= bagWeight ; j++) { 
            dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
    
        }
    }
    

遍歷順序

  • 01背包中,

    當在考慮某個物品時,必須確保在加入這個物品之前,已經知道了沒有這個物品的情況下到某個容量的最大價值。

    這就是為什麼在使用一維dp陣列時,需要首先遍歷物品,然後再遍歷容量的原因。

  • 但在完全背包中,

    既然物品可以被選取無限次,那麼考慮某個物品時不必限制只看一次。

    換句話說,可以在考慮這個物品的同時也考慮其他所有的物品。

    因此,不論先遍歷物品還是先遍歷容量,結果都是一樣的。

說明的最後部分提到"dp[j] 是根据 下标j之前所对应的dp[j]计算出来的"

意味著當我們計算dp[j](也就是容量為j時的最大價值)時,我們只需要確保考慮了所有容量小於j的情況。

這段說明的核心意義是:在完全背包問題中,我們計算一維dp陣列的方法相對較為靈活,而在01背包問題中,我們必須先考慮物品,然後再考慮容量。

總結

這裡說的都是單純的完全背包問題,所以for循環的順序是可以顛倒的

但在題目上,因為leetcode目前沒有純背包問題,所以題目如果稍有變化,就會體現在遍歷順序上

讀題

518. 零钱兑换 II

自己看到题目的第一想法

看完完全背包的題目後,我看這題就在試著用這個方式去解題

  1. 定義DP數組以及下標的含意

    dp[j] : 目標為j 的組成方式有dp[j]種

  2. 遞推公式

    dp[j] += dp[j - coins[i]] → dp[j] 等於 dp[j] + dp[j - cois[i]]種方式組成

    可以理解為 dp[j] 為包含當下conis[i]的數值可以組成的方法数,dp[j - conis[i]] 為不包含當下的conis[i]的數值

看完代码随想录之后的想法

如果今天要求組合或求排列是不一樣的

組合沒有順序,排列有順序

在遍歷順序上就會有所差別,假設今天要求的是組合那就是先遍歷物品在遍歷背包

但如果是求排列,則是先遍歷背包在遍歷物品

透過兩種不同的順序,得出不同的結果

377. 组合总和 Ⅳ

自己看到题目的第一想法

看到這題我的一個想法就是,這個就是求排列,程式碼基本一致,只要遍歷順序顛倒過來就可以了。

518. 零钱兑换 II - 實作

思路

  1. 定義DP數組以及下標的含意

    dp[j]: 組成金額為j 的方法有dp[j]種

  2. 遞推公式

    求組合就跟求目標和一樣,有多少方式可以組合成我們要的數

    dp[j] += dp[j - coins[i]];

  3. 根據遞推公式,確定DP數組如何初始化

    dp[0] = 1

    就像在目標和的章節一樣,現在要求的是組成0有多少種方法,那假設我甚麼都不選就至少有一種方法可以實現,所以初始化為1

    而其他数都是0,因為在不取任何数的狀況下無法達到

  4. 確定遍歷順序

    這是一個完全背包的應用問題

    所以在求背包容量時,是由小到大,而非大到小,因為同樣的數可以重複取

    但遍歷数組的先後就會有差

    假設先遍歷物品在遍歷背包,每個物品只會在當下在各個背包被遍歷一次,這沒有問題,這是組合

    但先遍歷背包在遍歷物品,每個物品會在不同的背包中因為順序不同,所以被設定為不同的組合,這是求排序

    所以我們必須先遍歷物品在遍歷背包。

Code

class Solution {
public:
    int change(int amount, vector<int>& coins) {
       vector<int> dp (amount + 1, 0);
       dp[0] = 1;
       for(int i = 0; i < coins.size(); i++) {
           for(int j = coins[i]; j <= amount; j++) {
               dp[j] += dp[j - coins[i]];
           }
       }
       return dp[amount];
    }
};

377. 组合总和 Ⅳ - 實作

思路

  1. 定義DP數組以及下標的含意

    dp[j]: 組合為j 的排列方法有dp[j]種

  2. 遞推公式

    dp[j] += dp[j - coins[i]];

  3. 根據遞推公式,確定DP數組如何初始化

    dp[0] = 1

  4. 確定遍歷順序

    這是一個完全背包的排列應用問題

    所以在求背包容量時,是由小到大,而非大到小,因為同樣的數可以重複取

    先遍歷背包在遍歷物品,每個物品會在不同的背包中因為順序不同,所以被設定為不同的組合,這是求排序

Code

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        vector<double> dp (target + 1, 0);
        dp[0] = 1;
        for(int j = 0; j <= target; j++) {
            for(int i = 0; i < nums.size(); i++) {
                if(j - nums[i] >= 0) dp[j] += dp[j - nums[i]];
            }
        }
        return dp[target];
    }
};

總結

自己实现过程中遇到哪些困难

今天看完完全背包後,第一部份提到的排列與組合的差異,在第二題馬上就用到了,所以主要前面都在理解完全背包的思路以及釐清排序跟組合的程式差異

今日收获,记录一下自己的学习时长

今天主要學習大約2hr,整體就是了解了完全背包的概念以及釐清排列與組合的差異。

相關資料

● 今日学习的文章链接和视频链接

完全背包

视频讲解:带你学透完全背包问题! 和 01背包有什么差别?遍历顺序上有什么讲究?_哔哩哔哩_bilibili

https://programmercarl.com/背包问题理论基础完全背包.html

518. 零钱兑换 II

视频讲解:动态规划之完全背包,装满背包有多少种方法?组合与排列有讲究!| LeetCode:518.零钱兑换II_哔哩哔哩_bilibili

https://programmercarl.com/0518.零钱兑换II.html

377. 组合总和 Ⅳ

视频讲解:动态规划之完全背包,装满背包有几种方法?求排列数?| LeetCode:377.组合总和IV_哔哩哔哩_bilibili

https://programmercarl.com/0377.组合总和Ⅳ.html文章来源地址https://www.toymoban.com/news/detail-720544.html

到了这里,关于代碼隨想錄算法訓練營|第四十六天|完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ。刷题心得(c++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 算法第四十一天-排除排序链表中的重复元素Ⅱ

    题意:在一个 有序 链表中,如果一个节点的值出现不止一次,那么把这个节点删除掉 重点: 有序链表 ,所以,一个节点的值出现不止一次,那么他们必相邻。 方法一:递归 链表和树的问题,一般都可以有递归和迭代两种写法。对于本题一定要记住是有序链表,值相同的节

    2024年04月11日
    浏览(97)
  • 算法训练第四十五天|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日
    浏览(59)
  • 算法训练第四十一天|343. 整数拆分 、96.不同的二叉搜索树

    题目链接:343. 整数拆分 参考:https://programmercarl.com/0343.%E6%95%B4%E6%95%B0%E6%8B%86%E5%88%86.html 题目描述 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。 示例 2: 输入:

    2023年04月24日
    浏览(44)
  • 算法训练第四十三天|1049. 最后一块石头的重量 II 、494. 目标和、474.一和零

    题目链接:1049. 最后一块石头的重量 II 参考:https://programmercarl.com/1049.%E6%9C%80%E5%90%8E%E4%B8%80%E5%9D%97%E7%9F%B3%E5%A4%B4%E7%9A%84%E9%87%8D%E9%87%8FII.html 题目难度:中等 有一堆石头,每块石头的重量都是正整数。 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分

    2023年04月09日
    浏览(37)
  • 算法训练第四十二天|01背包问题 二维 、01背包问题 一维、416. 分割等和子集

    视频链接:https://www.bilibili.com/video/BV1cg411g7Y6/ 参考:https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html 对于面试的话,其实掌握01背包,和完全背包,就够用了,最多可以再来一个多重背包。 而完全背包又是也是01背包稍作变化而来,即:完全

    2024年02月01日
    浏览(46)
  • 算法训练第四十九天 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机II

    题目链接:121.买卖股票的最佳时机 参考:https://programmercarl.com/0121.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BA.html 视频讲解:https://www.bilibili.com/video/BV1Xe4y1u77q 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一

    2024年02月01日
    浏览(39)
  • 算法训练第四十八天|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

    题目链接:198.打家劫舍 参考:https://programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入

    2023年04月16日
    浏览(40)
  • 第四十九天

    ●兼容性测试:主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行。 •兼容测试测什么? Android碎片化严重,每一款游戏/应用在上线之前,都会做一轮覆盖一定机型量的兼容性测试。 在产品面对海量用户之前,可以通过兼容测试尽量筛选出并解决所有影响

    2024年02月13日
    浏览(38)
  • 第四十七章 液态网络

    如弗洛格老师所料,巴哥奔果真倒头睡掉了一夜一昼又一夜。 再次醒来,浑身酸痛仍在,却是以鸡皮疙瘩的形式存在于皮肤上。临鸾连续弹出两个数字,其一是时间,其二是任务量。 时间很快得到室友们的确认,没错,现在已快到了跟老师面谈的时候。 任务量却令众人十分

    2024年02月09日
    浏览(38)
  • 学习java第四十三天

    Spring AOP 相关术语 (1)切面(Aspect):切面是通知和切点的结合。通知和切点共同定义了切面的全部内容。 (2)连接点(Join point):指方法,在Spring AOP中,一个连接点总是代表一个方法的执行。连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时

    2024年04月15日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包