代码随想录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/8/16 7:21:12 阅读更多 →
基于MiniMax H3与ComfyUI的低成本AI视频生成实战指南

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

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

2026/8/16 7:21:12 阅读更多 →
Win11 Realtek音频管理器消失?从驱动原理到修复方案全解析

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

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

2026/8/16 7:21:12 阅读更多 →

最新新闻

智能语义检索与AI辅助文献调研:WorkBuddy CNKI技能实战指南

智能语义检索与AI辅助文献调研:WorkBuddy CNKI技能实战指南

1. 从“大海捞针”到“精准定位”:为什么我们需要一个更聪明的文献检索方式如果你也经常需要查阅学术文献,无论是为了写论文、做项目还是追踪行业动态,那你一定对“文献检索”这四个字又爱又恨。爱的是,它为我们打开了知识的宝库&…

2026/8/16 8:14:40 阅读更多 →
被传歪明代古训:那些被后世误读、篡改的华夏老话

被传歪明代古训:那些被后世误读、篡改的华夏老话

作者:杨连江 很多我们从小到大挂在嘴边的俗语老话,传着传着意思就彻底变味了,有的被商人改动用来牟利,有的被后世曲解,还有的因为方言读音以讹传讹,丢掉了老祖宗本来的智慧。 先说一句大家最熟悉的&#xf…

2026/8/16 8:14:40 阅读更多 →
C#基础:调试存在变量,但是代码访问不到?一文教你如何处理编译时类型和运行时类型不一致!

C#基础:调试存在变量,但是代码访问不到?一文教你如何处理编译时类型和运行时类型不一致!

一、情景重现我在即使窗口输入:message.From[0]输出如下信息:{"123456" [123456qq.com](mailto:123456qq.com)} Address: "123456qq.com" Domain: "[qq.com](https://link.wtturl.cn/?targethttps%3A%2F%2Fqq.com&sceneim…

2026/8/16 8:14:40 阅读更多 →
我,AI员工,操作多个安全产品

我,AI员工,操作多个安全产品

我,AI员工,操作多个安全产品 我的工位有点特殊,没有电脑,也不在SOC大屏前,但每天打交道的系统可能比安全运营人员还多:防火墙、SIEM、流量检测、终端杀毒、漏洞管理、工单系统……都是我的“工作台”。 过…

2026/8/16 8:14:40 阅读更多 →
LeetCode智能刷题助手:苏格拉底式提示与AI模拟面试提升算法思维

LeetCode智能刷题助手:苏格拉底式提示与AI模拟面试提升算法思维

如果你正在准备技术面试,刷 LeetCode 可能是你每天都要面对的“必修课”。但你是否也经历过这样的困境:面对一道新题,毫无头绪,只能机械地翻看题解,看完后感觉“懂了”,关上页面却又无从下手?或…

2026/8/16 8:14:40 阅读更多 →
系统规划与管理师-第三章-考点记忆

系统规划与管理师-第三章-考点记忆

第三章1、云资源规划的重要性和目标。(1)提高效率(2)降低成本(3)确保可扩展性(4)提高可靠性和弹性(5)支持业务需求2、云资源规划的关键要素。(1&a…

2026/8/16 8:13:39 阅读更多 →

日新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →