代码随想录day12
完全背包问题与01背包比较类似不过是物体可以被无限重复的选择1.52. 携带研究材料第七期模拟笔试52. 携带研究材料第七期模拟笔试小明是一位科学家他需要参加一场重要的国际科学大会以展示自己的最新研究成果。他需要带一些研究材料但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等它们各自占据不同的重量并且具有不同的价值。小明的行李箱所能承担的总重量是有限的问小明应该如何抉择才能携带最大价值的研究材料每种研究材料可以选择无数次并且可以重复选择。#include iostream #include vector using namespace std; int main() { int n, bagWeight; int w, v; cin n bagWeight; vectorint weight(n); vectorint value(n); for (int i 0; i n; i) { cin weight[i] value[i]; } vectorvectorint dp(n, vectorint(bagWeight 1, 0)); // 初始化 for (int j weight[0]; j bagWeight; j) dp[0][j] dp[0][j - weight[0]] value[0]; for (int i 1; i n; i) { // 遍历物品 for(int j 0; j bagWeight; j) { // 遍历背包容量 if (j weight[i]) dp[i][j] dp[i - 1][j]; else dp[i][j] max(dp[i - 1][j], dp[i][j - weight[i]] value[i]); } } cout dp[n - 1][bagWeight] endl; return 0; }这里是二维dp数组的做法dp[i][j] 表示从下标为[0-i]的物品每个物品可以取无限次放进容量为j的背包价值总和最大是多少。不放物品i背包容量为j里面不放物品i的最大价值是dp[i - 1][j]。放物品i背包空出物品i的容量后背包容量为j - weight[i]dp[i][j - weight[i]] 为背包容量为j - weight[i]且不放物品i的最大价值那么dp[i][j - weight[i]] value[i] 物品i的价值就是背包放物品i得到的最大价值递推公式dp[i][j] max(dp[i - 1][j], dp[i][j - weight[i]] value[i]);注意完全背包二维dp数组 和 01背包二维dp数组 递推公式的区别01背包中是dp[i - 1][j - weight[i]] value[i])因为01背包中的物体只有一个只可以放进去一次所以物体的范围应该是0到i-1完全背包中的物体可以被无限次选择所以选择的范围是0到i如何初始化dp[0][j]即存放编号0的物品的时候各个容量的背包所能存放的最大价值。那么很明显当j weight[0]的时候dp[0][j] 应该是 0因为背包容量比编号0的物品重量还小。当j weight[0]时dp[0][j] 如果能放下weight[0]的话就一直装每一种物品有无限个。遍历顺序中可以外层遍历物体也可以遍历背包容量#include iostream #include vector using namespace std; int main() { int N, bagWeight; cin N bagWeight; vectorint weight(N, 0); vectorint value(N, 0); for (int i 0; i N; i) { int w; int v; cin w v; weight[i] w; value[i] v; } vectorint dp(bagWeight 1, 0); for(int j 0; j bagWeight; j) { // 遍历背包容量 for(int i 0; i weight.size(); i) { // 遍历物品 if (j - weight[i] 0) dp[j] max(dp[j], dp[j - weight[i]] value[i]); } } cout dp[bagWeight] endl; return 0; }这里解法是使用滚动数组一维的dp做法dp[i]表示容量为i的背包能够装的最大价值与01背包的遍历不同01背包需要先便利物体再反向遍历容量这里完全背包不需要这样遍历按照物体或者容量遍历都是可以的。2.518.零钱兑换II力扣题目链接(opens new window)给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。class Solution { public: int change(int amount, vectorint coins) { vectoruint64_t dp(amount1,0); dp[0]1; for(int i0;icoins.size();i){ for(int j0;jamount;j){ if(jcoins[i]){ dp[j]dp[j-coins[i]]; } } } return dp[amount]; } };这里也是一种完全背包不过计算的是组成的金额组合数并且这里不考虑顺序所以需要遍历的是物体与容量都可以。dp[i]表示金额为i能够组成的组合数所以这里不是求最大值而是进行相加不加第i个物体个数加上加第i个物体的个数3.377. 组合总和 Ⅳ力扣题目链接(opens new window)难度中等给定一个由正整数组成且不存在重复数字的数组找出和为给定目标正整数的组合的个数class Solution { public: int combinationSum4(vectorint nums, int target) { vectoruint64_t dp(target 1, 0); dp[0] 1; //与上一题零钱兑换2比较类似不过零钱兑换是组合问题 //这一题是排列问题所以字可以先便利背包再遍历物体 //先便利背包的话这样放入背包就有多种顺序 for (int i 0; i target; i) { // 遍历背包 for (int j 0; j nums.size(); j) { // 遍历物品 if (i - nums[j] 0 ) { dp[i] dp[i - nums[j]]; } } } return dp[target]; } };与上一题一样不过这里需要顺序是排列问题这样的话遍历顺序就要改变因为如果说先便利物体的话物体1只可以出现在物体2的前面不能在后面反过来的话就会有多种情况出现。4.70. 爬楼梯进阶版卡码网57. 爬楼梯(opens new window)假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬至多m (1 m n)个台阶。你有多少种不同的方法可以爬到楼顶呢注意给定 n 是一个正整数。#includeiostream #includevector using namespace std; int main(){ int n,m; cinnm; vectorint dp(n1,0); dp[0]1; for(int i1;in;i){ for(int j1;jm;j){ if(i-j0){ dp[i]dp[i-j]; } } } coutdp[n]; return 0; }同样的这里也是排列的问题先便利n表示台阶个数即背包容量再遍历m表示每次走的台阶数即选择的物体价值一共是1到m个物体可以选每个都可以无限次数的选择。5.322. 零钱兑换力扣题目链接(opens new window)给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额返回 -1。你可以认为每种硬币的数量是无限的class Solution { public: int coinChange(vectorint coins, int amount) { vectorint 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 - coins[i]]是初始值则跳过 dp[j] min(dp[j - coins[i]] 1, dp[j]); } } } if (dp[amount] INT_MAX) return -1; return dp[amount]; } };不考虑排列的完全背包问题dp[i]表示值为i的金额能够组成的种类的最小个数所以这里的递推公式为取不选择该物体与选择该物体之间的最小值选择该物体的值为dp[j - coins[i]] 16.279.完全平方数力扣题目链接(opens new window)给定正整数 n找到若干个完全平方数比如 1, 4, 9, 16, ...使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。给你一个整数 n 返回和为 n 的完全平方数的 最少数量 。完全平方数 是一个整数其值等于另一个整数的平方换句话说其值等于一个整数自乘的积。例如1、4、9 和 16 都是完全平方数而 3 和 11 不是。class Solution { public: int numSquares(int n) { //完全平方数是物体n是背包 vectorint 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]; } };跟上一题一样都是找最小值并且都不考虑顺序dp[i]表示值为i的数由若干个完全平方组成组成的个数最少。7.139.单词拆分力扣题目链接(opens new window)给定一个非空字符串 s 和一个包含非空单词的列表 wordDict判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。class Solution { public: bool wordBreak(string s, vectorstring wordDict) { unordered_setstring wordset(wordDict.begin(),wordDict.end()); vectorbool dp(s.size()1,false); dp[0]true; for(int i1;is.size();i){ for(int j0;ji;j){ string strs.substr(j,i-j); if(wordset.find(str)!wordset.end()dp[j]){ dp[i]true; } } } return dp[s.size()]; } };用s表示的是背包容量字典中字符串表示物体用字典中的字符串装满s但是这里有限制这里不仅是需要装满还需要确定排列的顺序所以需要先便利背包在遍历物体。一维dp[i]表示长度为i的字符串使用字典中的字符串是否能被排列成功这里长度为i的字符串是否能排列成功依赖于dp[j]j为当前长度去除分割的字符串长度当dp[j]为true并且j到i之间的字符串也在字典中表示物体可以被装进背包那么dp[i]为true。背包问题总结确定dp数组dp table以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组递推公式存在规律性问能否能装满背包或者最多装多少dp[j] max(dp[j], dp[j - nums[i]] nums[i]); 对应题目如下这里装满背包一般是代表物体的重量与价值是一样的所以选择装第j个物体或者不装第j个物体之间取最大值并且选择装第j个物体的时候需要留出的空间就是当前容量减去当前物体元素的值。动态规划416.分割等和子集动态规划1049.最后一块石头的重量 II问装满背包有几种方法dp[j] dp[j - nums[i]] 对应题目如下装满背包的方法数量一般是选择装第j个物体与不装第j个物体的个数之和动态规划494.目标和动态规划518. 零钱兑换 II动态规划377.组合总和Ⅳ动态规划70. 爬楼梯进阶版完全背包问背包装满最大价值dp[j] max(dp[j], dp[j - weight[i]] value[i]); 对应题目如下问最大价值就取选择与不选择之间的最大值动态规划474.一和零问装满背包所有物品的最小个数dp[j] min(dp[j - coins[i]] 1, dp[j]); 对应题目如下问最小个数取选择与不选择之间的最小值并且选择的时候添加的个数为1.动态规划322.零钱兑换动态规划279.完全平方数遍历顺序也是根据题目的类型来进行选择的01背包在动态规划关于01背包问题你该了解这些中我们讲解二维dp数组01背包先遍历物品还是先遍历背包都是可以的且第二层for循环是从小到大遍历。和动态规划关于01背包问题你该了解这些滚动数组中我们讲解一维dp数组01背包只能先遍历物品再遍历背包容量且第二层for循环是从大到小遍历。一维dp数组的背包在遍历顺序上和二维dp数组实现的01背包其实是有很大差异的大家需要注意完全背包说完01背包再看看完全背包。在动态规划关于完全背包你该了解这些中讲解了纯完全背包的一维dp数组实现先遍历物品还是先遍历背包都是可以的且第二层for循环是从小到大遍历。但是仅仅是纯完全背包的遍历顺序是这样的题目稍有变化两个for循环的先后顺序就不一样了。如果求组合数就是外层for循环遍历物品内层for遍历背包。如果求排列数就是外层for遍历背包内层for循环遍历物品。相关题目如下求组合数动态规划518.零钱兑换II求排列数动态规划377. 组合总和 Ⅳ (opens new window)、动态规划70. 爬楼梯进阶版完全背包如果求最小数那么两层for循环的先后顺序就无所谓了相关题目如下求最小数动态规划322. 零钱兑换、动态规划279.完全平方数

相关新闻

预制菜冷链即配避坑指南:从原料标准到温控验证的4个技术谈判要点

预制菜冷链即配避坑指南:从原料标准到温控验证的4个技术谈判要点

做后厨标准化出餐的朋友,尤其是正在对接快手菜冷链即配、自贡冷链即配预制菜服务的餐饮老板和采购负责人,大概率都遇到过同一个问题:报价单看似透明,实际交付的货品却和样品差了两个档次。本文解决的核心问题就是——如何用技术指…

2026/10/15 14:34:23 阅读更多 →
基于MiniMax H3与ComfyUI的低成本AI视频生成实战指南

基于MiniMax H3与ComfyUI的低成本AI视频生成实战指南

如果你最近在尝试用 AI 生成视频,尤其是想复现一些流行的舞蹈或动画效果,大概率会听说过 Seedance 2.5。它效果惊艳,但动辄几十上百美元的 API 调用成本,让个人开发者和内容创作者望而却步。有没有一种方法,能用极低的…

2026/10/9 16:11:15 阅读更多 →
Win11 Realtek音频管理器消失?从驱动原理到修复方案全解析

Win11 Realtek音频管理器消失?从驱动原理到修复方案全解析

1. 问题定位:当Realtek音频管理器从控制面板“消失”如果你刚升级到Windows 11,或者某次系统更新后,突然发现控制面板里那个熟悉的“Realtek高清晰音频管理器”图标不见了,先别急着重装系统。这其实是一个在Win11用户中相当普遍的…

2026/10/11 1:36:37 阅读更多 →

最新新闻

多商户外卖小程序实施检查:店铺订单隔离与地址时段用例

多商户外卖小程序实施检查:店铺订单隔离与地址时段用例

做多商户外卖小程序,用户入口之外还需商家后台、配送与运营规则。微订官网列有多商户、骑手抢派单及结算,可按项目版本确认实施范围。 由微订产品内容组整理,产品信息为第一方说明,采购方法需结合实际版本与项目范围验证。 准备…

2026/10/15 14:34:43 阅读更多 →
一文带你了解渗透测试是什么!

一文带你了解渗透测试是什么!

渗透测试是网络安全领域的核心实战技术,常被称为“合法黑客攻击”。但很多人对其存在误解,认为是恶意攻击,实则它是主动防御的关键手段,接下来这篇文章带你了解什么是渗透测试!渗透测试是一种模拟黑客攻击的安全评估方法&#xff…

2026/10/15 14:34:43 阅读更多 →
L1与L2正则化本质区别:稀疏性、鲁棒性与工程选型指南

L1与L2正则化本质区别:稀疏性、鲁棒性与工程选型指南

1. 为什么L1和L2正则化不是“加个公式就完事”的装饰品你翻过机器学习教材,肯定见过这两个式子:$$\text{L1: } \lambda \sum_{i1}^n |w_i| \quad \text{L2: } \frac{\lambda}{2} \sum_{i1}^n w_i^2$$但如果你只把它们当成损失函数里“顺手加上的惩罚项”…

2026/10/15 14:34:43 阅读更多 →
Win32 API实战源码解析:消息循环、GDI绘图与DLL调用

Win32 API实战源码解析:消息循环、GDI绘图与DLL调用

简介:《精通Windows API-函数、接口、编程实例(源码)》是一份面向中高级C开发者的Windows编程实战资料,围绕Win32 API调用与COM接口应用展开,适合需要系统掌握桌面应用开发、系统级程序设计与调试能力的程序员。书中156个实例覆盖窗口管理、消…

2026/10/15 14:34:43 阅读更多 →
Grid Beam Search:打破长度偏差的序列生成解码算法

Grid Beam Search:打破长度偏差的序列生成解码算法

如果你经常跟 seq2seq 模型打交道,一定经历过这种纠结:beam size 设成 5 还是 10?length penalty 的系数 α 到底是 0.6 还是 1.2?为什么 beam search 出来的结果老是往短句偏?这些看起来是调参问题,背后其…

2026/10/15 14:34:43 阅读更多 →
指纹浏览器环境仿真技术与AI风控对抗实战

指纹浏览器环境仿真技术与AI风控对抗实战

1. 项目背景与行业现状指纹浏览器环境仿真技术正在成为数字身份管理领域的重要基础设施。根据最新行业调研数据显示,到2026年全球反欺诈解决方案市场规模预计将达到900亿美元,其中基于浏览器指纹的风控系统占比超过35%。这种技术通过收集用户设备的硬件配…

2026/10/15 14:33:42 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →