代码随想录day38 动态规划6
题目:322.零钱兑换 279.完全平方数 139.单词拆分 多重背包 背包总结
需要重做:322,139
322. 零钱兑换
思路:零钱,可取多次-》完全背包。
注意:
五部:
1.dp[j]:价值为j的时候,最少需要几个coin
2.dp[j]=min(dp[j],dp[j-coins[i]]+1)
3.由递推式可知,0一定是0,其余的必须是INT——MAX或者根据题目要求的大的数,才能保证后面的不被0覆盖,而是由推出来的赋值的
4.先物品后bagsize
代码:
class Solution {
public:int coinChange(vector<int>& coins, int amount) {int n=coins.size();vector<int>dp(amount+1,10001);dp[0]=0;//初始化dp[0]为0即可。for(int i=0;i<n;i++){for(int j=0;j<=amount;j++){if(j>=coins[i])dp[j]=min(dp[j],dp[j-coins[i]]+1);}}if(dp[amount]==10001&&amount!=0)return -1;else return dp[amount]; }
}; 279.完全平方数
思路:跟上题的思路类似,但是初始化的时候有点不一样。以下给出两种解法
注意:初始化需要推导
五部:
1.dp[j]:总价值为j,我最少要多少个数
2.dp[j]=min(dp[j],dp[j-val[i]]+1);(代码1需要多一条特殊情况)
3.代码1 2给出两种
4.先val再bagsize或者先bagsize后val都行
代码1:初始化,dp[0]不初始化,单独列出
class Solution {
public:int numSquares(int n) {int val[102]={0};for(int i=0;i<=101;i++){val[i]=i*i;}vector<int>dp(n+1,10001);dp[1]=1;for(int i=1;val[i]<=n;i++){for(int j=val[i];j<=n;j++){dp[j]=min(dp[j],dp[j-val[i]]+1);if(j==val[i])dp[j]=min(dp[j],1);}}return dp[n];}
}; 代码2:初始化dp[0]=0,无意义,但是写法能统一
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++) { // 遍历背包dp[j] = min(dp[j - i * i] + 1, dp[j]);}}return dp[n];}
};
139.单词拆分
思路:可以想到回溯,但是回溯对于字符串的处理复杂,且不充分剪枝会超时,考虑dp。
将字符串里不同的单词看作物品,将整个字符串看作bagsize
注意:
五部:
1.dp[j]:该字符串长度为j的时候是否可以由字典的词组成
2.记 i<j ,如果i是true,且i到j在字典里,则j为true
3.初始化:dp[0]=true,其余为false
4.一定要先bagsize后物品,因为有要求顺序,是排列
代码:
class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {int bagsize=s.size();int n=wordDict.size();vector<int>dp(bagsize+1,0);dp[0]=1;unordered_set<string>wordSet(wordDict.begin(),wordDict.end());for(int j=1;j<=bagsize;j++){//先遍历背包容量for(int i=0;i<j;i++){//再遍历背包的所有物品string word=s.substr(i,j-i);if(wordSet.find(word)!=wordSet.end()&&dp[i]){dp[j]=1;}}}return dp[bagsize];}
}; 关于多重背包,你该了解这些!
有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。
每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了。
所以多重背包本质上是01背包
#include<iostream>
#include<vector>
using namespace std;
int main(){int c,n;cin>>c>>n;vector<int>weight(n,0);vector<int>val(n,0);vector<int>num(n,0);for(int i=0;i<n;i++)cin>>weight[i];for(int i=0;i<n;i++)cin>>val[i];for(int i=0;i<n;i++)cin>>num[i];vector<int>dp(c+1,0);for(int i=0;i<n;i++){//遍历物品for(int j=c;j>=weight[i];j--){//j为背包容量for(int k=1;k<=num[i]&&j>=k*weight[i];k++){//遍历个数dp[j]=max(dp[j],dp[j-k*weight[i]]+k*val[i]);}}}cout<<dp[c];
} 背包问题总结篇!摘自代码随想录

五部:
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
背包递推公式
问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]); ,对应题目如下:
- 动态规划:416.分割等和子集(opens new window)
- 动态规划:1049.最后一块石头的重量 II(opens new window)
问装满背包有几种方法:dp[j] += dp[j - nums[i]] ,对应题目如下:
- 动态规划:494.目标和(opens new window)
- 动态规划:518. 零钱兑换 II(opens new window)
- 动态规划:377.组合总和Ⅳ(opens new window)
- 动态规划:70. 爬楼梯进阶版(完全背包)(opens new window)
问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); ,对应题目如下:
- 动态规划:474.一和零(opens new window)
问装满背包所有物品的最小个数:dp[j] = min(dp[j - coins[i]] + 1, dp[j]); ,对应题目如下:
- 动态规划:322.零钱兑换(opens new window)
- 动态规划:279.完全平方数(opens new window)
#遍历顺序
#01背包
在动态规划:关于01背包问题,你该了解这些! (opens new window)中我们讲解二维dp数组01背包先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。
和动态规划:关于01背包问题,你该了解这些!(滚动数组) (opens new window)中,我们讲解一维dp数组01背包只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。
一维dp数组的背包在遍历顺序上和二维dp数组实现的01背包其实是有很大差异的,大家需要注意!
#完全背包
说完01背包,再看看完全背包。
在动态规划:关于完全背包,你该了解这些! (opens new window)中,讲解了纯完全背包的一维dp数组实现,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。
但是仅仅是纯完全背包的遍历顺序是这样的,题目稍有变化,两个for循环的先后顺序就不一样了。
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
相关题目如下:
- 求组合数:动态规划:518.零钱兑换II(opens new window)
- 求排列数:动态规划:377. 组合总和 Ⅳ (opens new window)、动态规划:70. 爬楼梯进阶版(完全背包)(opens new window)
如果求最小数,那么两层for循环的先后顺序就无所谓了,相关题目如下:
- 求最小数:动态规划:322. 零钱兑换 (opens new window)、动态规划:279.完全平方数(opens new window)
对于背包问题,其实递推公式算是容易的,难是难在遍历顺序上,如果把遍历顺序搞透,才算是真正理解了。
#总结
这篇背包问题总结篇是对背包问题的高度概括,讲最关键的两部:递推公式和遍历顺序,结合力扣上的题目全都抽象出来了。
而且每一个点,我都给出了对应的力扣题目。
最后如果你想了解多重背包,可以看这篇动态规划:关于多重背包,你该了解这些! (opens new window),力扣上还没有多重背包的题目,也不是面试考察的重点。
相关文章:
代码随想录day38 动态规划6
题目:322.零钱兑换 279.完全平方数 139.单词拆分 多重背包 背包总结 需要重做:322,139 322. 零钱兑换 思路:零钱,可取多次-》完全背包。 注意: 五部: 1.dp[j]:价值为j的时候,最…...
LabVIEW无标题的模态VI窗口的白框怎么去除?
在LabVIEW中,如果你遇到无标题的模态(modal)VI窗口显示有一个白框,通常是由于VI界面的一些属性或者控件设置问题导致的。为了去除这个白框,可以尝试以下几种方法: 1. 检查VI窗口属性设置 确保你的VI窗口属…...
iOS - 原子操作
在 Objective-C 运行时中,原子操作主要通过以下几种方式实现: 1. 基本原子操作 // 原子操作的基本实现 #if __has_feature(c_atomic)#define OSAtomicIncrement32(p) __c11_atomic_add((_Atomic(int32_t) *)(p), 1, __ATOMIC_RELAXED) #define …...
Go语言的语法
Go语言入门与实战 引言 在当今的开发环境中,随着互联网的快速发展,程序员们面临着越来越复杂的系统需求。针对这些需求,Go语言(又称Golang)作为一种新的编程语言应运而生。Go语言由Google开发,它具有简单…...
【MySQL 保姆级教学】用户管理和数据库权限(16)
数据库账户管理是指对数据库用户进行创建、修改和删除等操作,以控制用户对数据库的访问权限。通过账户管理,可以设置用户名、密码、主机地址等信息,确保数据库的安全性和可控性。例如,使用 CREATE USER 创建用户,ALTER…...
什么是 ES6 “模板语法” ?
ES6 提出了“模板语法”的概念。在 ES6 以前,拼接字符串是很麻烦的事情 var name css var career coder! var hobby [coding ,"writing] var finalString my name is name ,I work as a career I love hobby[0] and hobby[1]仅仅几…...
[项目实战2]贪吃蛇游戏
目录 贪吃蛇游戏:: 一、游戏效果及功能实现: 1.规则 2.基本功能实现 3.技术要点 …...
关于FPGA中添加FIR IP核(采用了GOWIN EDA)
文章目录 前言一、IP核二、MATLAB文件三、导出系数COE文件1.设计滤波器2.用官方的matlab代码或者直接用文本文件 四、进行模块化设计源文件 前言 FIR滤波器的特点是其输出信号是输入信号的加权和,权值由滤波器的系数决定。每个系数代表了滤波器在特定延迟位置上的“…...
1. 使用springboot做一个音乐播放器软件项目【前期规划】
背景: 现在大部分音乐软件都是要冲会员才可以无限常听的。对于喜欢听音乐的小伙伴,资金又比较紧张,是那么的不友好。作为程序员的我,也是喜欢听着歌,敲着代码。 最近就想做一个音乐播放器的软件,在内网中使…...
【Dify】Dify自定义模型设置 | 对接DMXAPI使用打折 Openai GPT 或 Claude3.5系列模型方法详解
一、Dify & DMXAPI 1、Dify DIFY(Do It For You)是一种自动化工具或服务,旨在帮助用户简化操作,减少繁琐的手动操作,提升工作效率。通过DIFY,用户能够快速完成任务、获取所需数据,并且可以…...
【Rust自学】10.8. 生命周期 Pt.4:方法定义中的生命周期标注与静态生命周期
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 10.8.1. 方法定义中的生命周期标注 还记得在上一篇文章 10.7. 生命周期 Pt.3 中所提到的省略生命周期的三条规则吗: 规则1&…...
121 买入股票的最佳时机
思路1: 买的那天一定是卖的那天之前的最小值。 每到一天,维护那天之前的最小值即可。 假设第一天是最小值,最大值初始化为0,当以后某天的价格小于最小值时,将最小值更新 当天价格大于最小值,说明有利可图…...
PID学习资料
TI公司的CONTROLSUITE https://www.ti.com.cn/tool/cn/CONTROLSUITE学点PID专栏-小麦大叔PID控制器算法系列TI公开培训(中文字幕) 电机控制,PI控制器,PID控制器和现场定向控制 书籍: Advanced PID Control先进PID控制及其MATLAB仿真Practic…...
采用标准化的方式开展设计-研发中运用设计模式
概述 实现规范化、标准化的引导式设计,以业务需求为输入,识别业务特点,并通过引导式设计,找到最适合的设计模式、具体方案,汇总成为应用的设计,拉齐各应用的设计一的致性。 采用标准化的方式开展设计…...
【Linux系列】并发与顺序执行:在 Linux 脚本中的应用与选择
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
Scala语言的数据库交互
Scala语言的数据库交互 引言 在当今互联网应用的开发中,数据库几乎是每一个应用程序中不可或缺的一部分。选择合适的编程语言和工具与数据库进行交互,对于提升开发效率和应用性能至关重要。Scala作为一种现代的多范式编程语言,结合了面向对…...
字节青训十五题-Java-数字字符串格式化
问题 问题描述 小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程…...
搭建一个本地轻量级且好用的学习TypeScript语言的环境
需求说明 虽然 TypeScript 的在线 Playground 很方便 https://www.tslang.com.cn/play/,但毕竟是在浏览器中使用,没有本地的 IDE 那么顺手。所以我想搭建一个本地类似 Playground 的环境,这样在学习 TypeScript 的过程中,可以更方…...
apex安装
安装过程复杂曲折,网上说的很多办法,貌似成功了,实际还是没起作用。 先说成功过程,执行下面命令,安装成功(当然,前提是你要先配置好编译环境): (我的环境&a…...
会员制电商创新:开源 AI 智能名片与 2+1 链动模式的协同赋能
摘要:本文聚焦于电商领域会员制的关键作用,深入探讨在传统交易模式向数字化转型过程中,如何借助开源 AI 智能名片以及 21 链动模式商城小程序,实现对会员数据的精准挖掘与高效利用,进而提升企业的营销效能与客户洞察能…...
终极指南:用TegraRcmGUI轻松解锁Nintendo Switch的无限潜力
终极指南:用TegraRcmGUI轻松解锁Nintendo Switch的无限潜力 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI 还在为Nintendo Switch的封闭系统感到…...
Windows 11下Intel Realsense D435i深度相机Python开发环境搭建与实战
1. 深度相机入门:认识你的Intel Realsense D435i 第一次接触深度相机时,我和很多人一样被它酷炫的3D感知能力吸引。Intel Realsense D435i作为消费级深度相机的代表,它的实际表现远超我的预期。这款设备看起来像个普通摄像头,但内…...
MICROCHIP微芯 AT24C32D-SSHM-T SOP8 EEPROM
特性 低压和标准电压操作-工作电压范围:1.7至5.5V 内部组织的4096x8,8192x82线串行接口 Schmitt触发器,带滤波输入以抑制噪声 双向数据传输协议 .1MHz(5.0V)和400KHz(1.8V兼容性) 写保护引脚用于硬件数据保护 .32字节页面写入模式(允许部分页面写入) .自动定时写周期…...
Wise Care 365 优化工具安装教程:安装+系统优化工具
一、工具简介 Wise Care 365 是一款集系统清理、注册表修复、磁盘碎片整理及隐私保护于一体的 Windows 优化工具。 安装包下载:https://pan.quark.cn/s/36a0dcbfcf38 二、使用步骤 1. 解压工具包 右键点击【WiseCare...】压缩包 → 选择【解压到 WiseCare36…...
数据增强技术对比:Mosaic、Mixup、Cutout与CutMix的核心优势与应用场景
1. 数据增强技术入门指南 当你第一次训练计算机视觉模型时,可能会遇到一个常见问题:为什么模型在训练集上表现很好,但在真实场景中却频频出错?这往往是因为训练数据不够多样化。数据增强技术就是解决这个问题的利器,它…...
【R 4.5大数据处理性能跃迁指南】:20年实战验证的7大底层优化策略(含benchmark实测提升3.8×)
第一章:R 4.5大数据处理性能跃迁的核心动因与基准定位R 4.5 版本在底层内存管理、向量化执行引擎及并行调度机制上实现了结构性升级,显著提升了大规模数据集(GB级及以上)的加载、聚合与建模效率。其核心动因并非单一优化ÿ…...
信托资金流向与交易对手辨析:钱给了谁,谁就是交易对手吗?
目录 一、 核心误区:资金流向 ≠ 交易对手 二、 谁才是真正的“交易对手”? 三、 如何一眼识别真正的交易对手? 总结 在信托业务和资产管理领域,很多初学者甚至从业者容易产生一个误区:认为信托公司把钱打给谁&…...
5款降重降AI工具实测 2026毕业季首选SpeedAI科研小助手
2026年毕业季临近,知网、维普、Turnitin等主流学术检测平台的AIGC检测算法已完成新一轮迭代升级,论文AI生成率不再是无关紧要的附加指标,而是直接影响审核通过、答辩资格的核心门槛。教育部对学术成果中AI使用的规范要求不断收紧,…...
SeqGPT-560M镜像免配置教程:无需pip install,直接运行Web服务
SeqGPT-560M镜像免配置教程:无需pip install,直接运行Web服务 本文介绍如何快速使用SeqGPT-560M镜像,无需任何环境配置,直接启动Web服务进行文本分类和信息抽取。 1. 什么是SeqGPT-560M? SeqGPT-560M是阿里达摩院推出…...
深入浅出:IgH EtherCAT主站的实时性优化技巧(从内核配置到线程调度)
深入浅出:IgH EtherCAT主站的实时性优化技巧(从内核配置到线程调度) 在工业自动化领域,毫秒级的延迟可能导致生产线停摆,微秒级的抖动可能引发机器人轨迹偏差。作为开源EtherCAT主站的标杆,IgH的性能直接决…...
