当前位置: 首页 > news >正文

二刷代码随想录训练营Day 38|322. 零钱兑换、279.完全平方数、139.单词拆分

1.零钱兑换

视频讲解:动态规划之完全背包,装满背包最少的物品件数是多少?| LeetCode:322.零钱兑换_哔哩哔哩_bilibili

代码随想录

代码:

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

 note:

注意,如果dp[j]没有被重新赋值(说明没有能够装满其背包的情况),不能在递推公式里使用。以及结果也要判断。

dp数组的含义:用下标为[0,i]的coins的元素(不限数量)去填满容量为j的背包,所用的数量最少为dp[j]

递推公式:如果装的下第j个物品,且dp[j - coins[i]]已经被重新赋值过,dp[j] = min(dp[j], dp[j - coins[i]])

dp数组的初始化:因为求最小值,所以将所有元素初始化为INT_MAX,同时按照定义去初始化dp[0] = 0

遍历顺序:这道题不涉及组合和排列的区别,所以先遍历背包还是物品都可以。不限数量,是完全背包问题,所以遍历背包的时候,要正序遍历。

2.完全平方数

视频讲解:动态规划之完全背包,换汤不换药!| LeetCode:279.完全平方数_哔哩哔哩_bilibili

代码随想录

代码:

class Solution {
public:int numSquares(int n) {vector<int>dp (n + 1,INT_MAX);dp[0] = 0;for(int i = 1; i * i <= n; i++){for(int j = i * i; j <= n; j++){// 因为有1,所以肯定每个数都能写成完全平方数相加的形式dp[j] = min(dp[j - i * i] + 1,dp[j]);}}return dp[n];}
};

 note:

注意点:这里物品的遍历的终止条件是 i * i <= n,其实挺好想的。以及i从1开始遍历,这里其实是因为我们平时使用i的时候,都是把它当数组下标来遍历的。这里可以看成i直接变成了我们遍历的数组的元素值,就是直接是物品的重量的。

以及,因为完全平方数有1,所以肯定每个数都有对应的“解”,和上题有可能没有解的情况不一样。

剩下的,和上题基本没区别,我就懒得写了。

3.单词拆分

视频讲解:动态规划之完全背包,你的背包如何装满?| LeetCode:139.单词拆分_哔哩哔哩_bilibili

代码随想录

代码:

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(),wordDict.end());vector<bool> dp(s.size() + 1,false);dp[0] = true;for(int j = 1; j <= s.size(); j++){for(int i = 0; i < j; i++){ // 截取[i,j - 1]的字符串去判断有没有再wordDict出现过string word = s.substr(i,j - i);if(wordSet.find(word) != wordSet.end() && dp[i]){dp[j] = true;}}}return dp[s.size()];}
};

 note:

dp数组的含义:长度为j的从下标为0开始的子串是否可以用给定的字符串数组填满

递推公式:如果[0,i - 1]的子串已经判断可以被填满,且下标为[i , j - 1]的下标也可以被填满,那么dp[j]也是true

dp数组的初始化:首先全初始化为false,不然就全对了,判断个什么。以及dp[0]要为true,没有实际含义,完全是为了递推公式可以正常推导。

遍历顺序:这道题是排列问题。因为我们是根据前面已经判断好的子串来确定后面的子串是否被填满的。而很明显子串要被物品拼满,是要注重顺序的,不同的顺序对应的拼成的子串是不同的。

所以,先遍历背包,再遍历物品,且背包容量必须正序遍历。

4.背包问题总结

代码随想录 (programmercarl.com)

在此总结一下背包问题的注意事项:

背包问题的dp数组在定义的时候,一般大小为bagweight + 1,因为背包的容量从0开始,所以个数要额外加1

01背包二维dp数组:遍历顺序无所谓,初始化的时候,要把第一行第一列的元素处理好,按照定义来就好了。其余元素初始化成多少都行,因为会被覆盖的

01背包 一维dp数组:先遍历物品,再遍历背包,背包要倒序遍历。

完全背包 一维dp数组:先遍历物品还是背包都可以,背包要正序遍历。

完全背包 一维dp数组 组合问题:先遍历物品,再遍历物品,背包要正序遍历。

背包问题 一维dp数组 排列问题:先遍历背包,再遍历物品,背包要正序遍历。

关于排列组合的区别的解释:

        就像我们在回溯算法里使用startIndex一样,组合问题,每次都是将物品遍历完就不会使用了,换句话说,物品出现的顺序是固定的。背包问题也是,先遍历物品,再遍历背包,就是指定了物品,针对一个物品去遍历不同的背包容量,使用过后就不会再去用了。
        排列问题就不一样。锁定一个背包容量,去遍历不同的物品,就会出现之前使用的物品,物品的顺序是不固定的,不同的顺序算所不同的种类了。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 证书学习(一)keytool 工具使用介绍
  • Lesson 81+82 Roast beef and potatoes
  • RAG优化技巧 | 7大挑战与解決方式 | 提高你的LLM: 下篇
  • k8s 进阶实战笔记 | Ingress-traefik(一)
  • C++ | Leetcode C++题解之第363题矩形区域不超过K的最大数值和
  • 【linux】sar -d 磁盘性能
  • 【IEEE】第四届智能通信与计算国际学术会议(ICICC 2024,10月18-20)
  • vuejs 源代码启动 调试
  • Java中的持久化框架对比:JPA vs MyBatis
  • MAC 安装 MySQL
  • 计算机毕业设计选题推荐-花园管理系统-Java/Python项目实战
  • Linux | vim编辑器的使用技巧:自动缩进、补全括号、光标定位、批量注释
  • Spring Cloud LoadBalancer 源码解析
  • 前端CSS选择器
  • 页面设计任务 个人网站页面
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • CentOS从零开始部署Nodejs项目
  • CSS 三角实现
  • css的样式优先级
  • ES2017异步函数现已正式可用
  • express如何解决request entity too large问题
  • extjs4学习之配置
  • Java 内存分配及垃圾回收机制初探
  • JavaScript标准库系列——Math对象和Date对象(二)
  • laravel with 查询列表限制条数
  • log4j2输出到kafka
  • React-redux的原理以及使用
  • Xmanager 远程桌面 CentOS 7
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 从setTimeout-setInterval看JS线程
  • 基于游标的分页接口实现
  • 解析 Webpack中import、require、按需加载的执行过程
  • 浅谈Golang中select的用法
  • 嵌入式文件系统
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • Linux权限管理(week1_day5)--技术流ken
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​浅谈 Linux 中的 core dump 分析方法
  • # centos7下FFmpeg环境部署记录
  • #QT(QCharts绘制曲线)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (第二周)效能测试
  • (二十三)Flask之高频面试点
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (南京观海微电子)——示波器使用介绍
  • (三)uboot源码分析
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (算法)Travel Information Center
  • (五)Python 垃圾回收机制
  • (一) 初入MySQL 【认识和部署】